Harasees_Singh Ответов: 3

Перегрузка оператора new в проекте MFC - C++


я попытался перегрузить оператор new в MFC, и он не компилировался, поэтому я сделал #undef new, но он все еще не работал из-за ошибок компоновщика, таких как:

ошибка LNK2005: "Void * после __оператор ключевое слово cdecl новый(без знака __int64 значение типа)" (??2@YAPEAX_K@я) уже определены в SoftwareDlg базе.параметр obj

и

фатальная ошибка LNK1169: найден один или несколько многозначных символов

void* operator new(size_t size)
{
 return malloc(size);
}


Что я уже пробовал:

Я попробовал #undef new, но он все равно давал ошибки

3 Ответов

Рейтинг:
2

Rick York

То, что вы сделали, было предоставлением альтернативной реализации функции. Это не переопределение, и именно поэтому вы получаете ошибку ссылки.

Способ, которым MFC делает это, заключается в переопределении new to DEBUG_NEW в каждом исходном модуле, а затем они предоставляют реализацию DEBUG_NEW. Вам нужно сделать что-то подобное. Определение МФЦ выглядит следующим образом :

#ifdef _DEBUG
#define new DEBUG_NEW
#endif
поэтому вам нужно сделать что-то вроде :
#ifdef _DEBUG
#define new MyNew
#endif
и предоставить прототип и определение этой функции. Вы можете начать с вариации того, что у вас есть :
void* operator MyNew( size_t size )
{
   return calloc( 1, size);   // calloc will set the memory to zero also
}


Rick York

Вот почему я написал: "предоставьте прототип..." Если он не определен, это означает, что вы не предоставили для него прототип, поэтому он будет определен.

Рейтинг:
2

Richard MacCutchan

Я предлагаю вам прочитать новый оператор (C++) | Microsoft Docs[^], который показывает, как создать свою собственную версию new. Однако я заметил, что вы говорите, что вы новичок в C++, поэтому я думаю, что вам лучше сначала сосредоточиться на основах.


Рейтинг:
0

steveb

оператор new определяется в глобальном пространстве имен. Зачем вам нужно его определять? Неужели оператор по умолчанию не соответствует вашим потребностям?


Harasees_Singh

@steveb я хочу знать, сколько памяти кучи и программа инициализирует и освобождает, поэтому я могу просто перегрузить оператор и добавить еще одну строку кода, чтобы отслеживать память, которую я инициализирую или освобождаю