2014-11-29 3 views
1

Я найти утечку памяти в моей программе, я попробовал следующее руководство от MicrosoftОбнаружение утечки памяти при перегрузке нового оператора?

http://msdn.microsoft.com/en-us/library/e5ewb1h3%28v=vs.90%29.aspx 

Но есть некоторые элементы отчета утечки памяти, не имя исходного файла и строки кода.

Я попытался использовать VLD, но VLD не отображает имя файла в стеке вызовов, хотя я сделал какой-либо шаг в руководствах в Интернете.

Из отчета о утечке памяти из VLD я вижу, что размер блока просочился. Поэтому у меня есть идея. Предположим, что я могу перегрузить новый оператор и отлаживать его, возможно, я смогу обнаружить, где утечка памяти произошла с помощью специальной точки останова в качестве кода ниже.

void* operator new (size_t size) 
{ 
    if(size = 1107) 
    { 
     int temp = 0; //Put the break point here 
    } 
    void *p = malloc(size); 
    return p; 
} 

Но я не могу перегрузить оператор новый, потому что ошибка при компиляции программы:

Error 166 error LNK2005: "void * __cdecl operator new(unsigned __int64,char *,unsigned int)" ([email protected][email protected]) already defined in CommonGlobal.obj E:\TIN HOC\Learning\Chuong Tring Dao Tao\Working\Main_Code\Mystic\branches\DVRServer\Common\Message.obj Common 

Кто-то может сказать мне, как перегрузить оператор новый, для отладки в нем?

+2

Возможно, перегрузка определена в заголовке без 'inline'? – Angew

+4

'size = 1107' ... те жуткие присваивания –

+3

@TTGroup, не связанные, но я надеюсь, что вы знаете, что ваш' if' всегда оценивается как 'true' – vsoftco

ответ

1

Компонент жалуется на переопределение оператора нового. Вероятно, вы определили эту функцию в файле заголовка, который включен в несколько файлов (по крайней мере, в 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 перед включением vld.h.

+0

Спасибо, я добавляю ключевое слово inline и оно построено без ошибок. Я установил Visual Leak Detector версии 2.4RC2, и приложение запускается как режим отладки. Но я не могу видеть имя файла и строку в журналах VLD. – TTGroup

0

Пожалуйста, включите новый

#include <new> 

и, как Кара mentiond изменить строку, если (размер = 1107) в

if(size == 1107) 

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

+0

--- 1: Включая '', очевидно, не собирается вызывать ошибку переопределения. –

+1

так же, как запрет «-1» не заставит его уйти. Так что, черт возьми, ты делаешь, * снова *? –

Смежные вопросы