Обнаружить утечку памяти при перегрузке нового оператора?

Я обнаружил утечку памяти в моей программе, я попробовал следующее руководство от 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)

тогда программа работает.

Другие вопросы по тегам