Обнаружить утечку памяти при перегрузке нового оператора?
Я обнаружил утечку памяти в моей программе, я попробовал следующее руководство от Microsoft
http://msdn.microsoft.com/en-us/library/e5ewb1h3%28v=vs.90%29.aspx
Но есть некоторые элементы отчета об утечке памяти, у которых нет имени исходного файла и строки кода.
Я пытался использовать VLD, но VLD не показывает имя файла в стеке вызовов, хотя я делал какие-либо шаги в руководствах в Интернете.
Из отчета об утечке памяти VLD я вижу размер утечки блока. Итак, у меня есть идея. Предположим, что я могу перегрузить оператор new и отладить его, возможно, я смогу определить, где произошла утечка памяти в результате специальной точки останова, как показано ниже.
void* operator new (size_t size)
{
if(size = 1107)
{
int temp = 0; //Put the break point here
}
void *p = malloc(size);
return p;
}
Но я не могу перегрузить оператор new, потому что у меня ошибка при компиляции программы:
Error 166 error LNK2005: "void * __cdecl operator new(unsigned __int64,char *,unsigned int)" (??2@YAPEAX_KPEADI@Z) already defined in CommonGlobal.obj E:\TIN HOC\Learning\Chuong Tring Dao Tao\Working\Main_Code\Mystic\branches\DVRServer\Common\Message.obj Common
Кто-то может подсказать, как перегрузить оператор new, для отладки в нем?
2 ответа
Компоновщик жалуется на переопределение оператора new. Вы, вероятно, определили эту функцию в заголовочном файле, который включен в несколько файлов (по крайней мере, в CommonGlobal.cpp и Message.cpp). Переместите его в исходный файл или добавьте inline
спецификатор к нему. Если вы определили оператор new в исходном файле, убедитесь, что он содержится только в одном исходном файле - он применяется ко всем вызовам оператора new во всех ваших исходных файлах.
Так же if(size = 1107)
это подозрительно - он всегда ломается и всегда выделяет память размером 1107. Измените ее на if(size == 1107)
если вы хотите разбить, когда размер равен 1107. В Windows вы также можете вызвать __debugbreak()
которая разбивается на отладчик без необходимости вручную устанавливать точку останова, но вы не можете ожидать, что она будет работать под другим компилятором, чем Visual C++.
И для визуального детектора утечки: вы видели сообщение, как Visual Leak Detector Version 2.4RC2 installed
сообщение в окне вывода VS и консоли? Если нет, переключите активную конфигурацию с Release на Debug или #define VLD_FORCE_ENABLE
до включения влд.ч.
Пожалуйста, включите новый
#include <new>
и, как упомянула Кароли, измените строку, если (размер = 1107) на
if(size == 1107)
тогда программа работает.