Подтвердить что ты не робот

С++ - Проверка утечки памяти с помощью _CrtDumpMemoryLeaks() - не выводит номера строк

Я работаю над игрой с SDL в Visual Studio 2010. Я наткнулся на макрос _CrtDumpMemoryLeaks() и подумал, что я отдам его. Вызов _CrtDumpMemoryLeaks() выполняет печать утечек памяти в окне вывода, но не показывает, где это происходит.

Я прочитал статью MSDN в Включение обнаружения утечки памяти, и объясняет, что если я определяю _CRTDBG_MAP_ALLOC, он должен вывести номер строки заявления о нарушении. Это не происходит в моем случае. (Однако я мог заставить его работать, если я использую malloc() напрямую - не используя "новое" ).

Код:

#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int *var = new int(5);

    _CrtDumpMemoryLeaks();

    return 0;
}

Вывод следующий:


Detected memory leaks!
Dumping objects ->
{58} normal block at 0x007D1510, 4 bytes long.
 Data: <    > 05 00 00 00 
Object dump complete.

Если _CrtDumpMemoryLeaks() не может выводить номера строк при распределении с использованием "нового", тогда предлагаются предложения по другим способам достижения аналогичного поведения.

4b9b3361

Ответ 1

Когда вы определяете _DEBUG и включаете <crtdbg.h>, вы получаете перегруженный operator new, который принимает дополнительные параметры, которые вы можете использовать для указания номеров файлов и строк в выражениях размещения new.

например.

int* p = new (_NORMAL_BLOCK, __FILE__, __LINE__) int(5);

Вы можете обернуть это в условно определенный макрос, например

#ifdef _DEBUG
#define DEBUG_NEW_PLACEMENT (_NORMAL_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_NEW_PLACEMENT
#endif

int* p = new DEBUG_NEW_PLACEMENT int(5);

Пока вы видите, как люди, определяющие макрос new, полностью скрывают этот код клиента формы, я лично не рекомендую его, поскольку он что-то уже намеренно использует, используя размещение new, и вы должны убедиться, что все заголовки, использующие размещение new ( такие как многие стандартные заголовки) включены перед тем, как переопределить заголовок new. Это упростит возможность прокрутки некоторых встроенных приложений new в файлах заголовков без "корректировки".

Ответ 2

Это старая версия Visual Leak Detector.

Попробуйте следующее: http://vld.codeplex.com/

Ответ 3

Вам могут потребоваться эти определения после того, как вы включите


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

Ответ 5

Принятый ответ Чарльза Бейли требует, чтобы вы изменили исходный код, и это не обязательно. Если вы используете new и delete (или версии массива), все, что вам нужно сделать, это поместить этот фрагмент кода в файл stdafx.h каждого из ваших проектов (включая любые статические или динамические зависимости библиотек) и он затем предоставит исходный файл и номер строки, прикрепленный к каждому пропущенному объекту памяти:

#ifdef _DEBUG
   #ifndef DBG_NEW
      #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
      #define new DBG_NEW
   #endif
#endif  // _DEBUG

Это прямо из Microsoft веб-страницы по этому вопросу.