C++ - тестирование Утечки памяти с _CrtDumpMemoryLeaks () - не производит номера строки

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

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

Код:

#define _CRTDBG_MAP_ALLOC
#include 
#include 

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() не может произвести номера строки при выделении использования 'нового' затем, предложения для других способов достигнуть подобного поведения ценятся.

16
задан DanielV 30 March 2016 в 14:36
поделиться

4 ответа

Когда вы определяете _DEBUG и включаете , вы получаете перегруженный оператор 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 в файлах заголовков без «корректировки».

9
ответ дан 30 November 2019 в 21:45
поделиться

Вам могут понадобиться эти определения после ваших include


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
3
ответ дан 30 November 2019 в 21:45
поделиться

Посмотрите на кусок кода.

Перегрузка оператора new и оператора delete для регистрации всех выделений и деаллокаций памяти

Я определил свои утечки памяти с помощью этого метода.

2
ответ дан 30 November 2019 в 21:45
поделиться

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

Попробуйте это: http://vld.codeplex.com/

8
ответ дан 30 November 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: