Аннотация:
Статья посвящена проблеме, которая постоянно преследует программистов на C/C++, — обнаружению и локализации утечек памяти. Автор демонстрирует применение средств библиотеки времени выполнения (CTR), поставляемой с Visual C++, с помощью которых утечки памяти можно устранить гораздо быстрее и проще, чем методом "пристального взгляда".
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Существуют неплохие программные продукты для борьбы с утечками памяти, чтения неинициализированной памяти & etc. К примеру Rational Purify Plus, Insure++. Тем, кому необходимо разобраться с большим проектом — рекоммендую.
Я вроде поставил и в библиотеке и в приложении кругом _CRTDBG_MAP_ALLOC, да нифига всё равно не получается строчки получить :(
Можно с этим бороться или нет?
Est nekotoraya dll, pri kompilacii ispolzuyutsia RELEASE versii MFC(shared) i CRT, prichem ispolzovat static MFC ili shared DEBUG MFC nelziya. Mozhno li kakim libo obrazom vkluchit standartnie sredstva obnaruzheniya i lokalizacii utechek pamiati ?
в одной из экспортируемых фуекций выделяю по new , но не освобождаю память, в конце программы получаю:
Detected memory leaks!
Dumping objects ->
e:\program files\microsoft visual studio\vc98\include\crtdbg.h(552) : {171} normal block at 0x010C9008, 50 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Как заставить отображаться имя и номер строки места выделения памяти в _моем_ файле?
Снаскоку не получилось.
в stdafx.h:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
В DllMain:
if (dwReason == DLL_PROCESS_ATTACH)
{
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
...
букет ошибок:
Compiling...
StdAfx.cpp
d:\program files\microsoft visual studio\vc98\include\malloc.h(105) : error C2059: syntax error : 'constant'
d:\program files\microsoft visual studio\vc98\include\malloc.h(105) : error C2733: second C linkage of overloaded function '_calloc_dbg' not allowed
d:\program files\microsoft visual studio\vc98\include\malloc.h(105) : see declaration of '_calloc_dbg'
тоже самое для _free_dbg,_malloc_dbg,_realloc_dbg,_expand_dbg,_msize_dbg
Однако нет, BC — штука мощная, но довольно тормозная, держать ее включенной постоянно нет никаких сил, а описанные методы не требуют практически никаких ресурсов и при этом _постоянно_ предохраняют (или по крайней мере сигнализируют) от неприятностей с памятью.
Здравствуйте, Курилка, Вы писали:
К>Я вроде поставил и в библиотеке и в приложении кругом _CRTDBG_MAP_ALLOC, да нифига всё равно не получается строчки получить К>Можно с этим бороться или нет?
У меня тоже эта же проблема, пробовал везде задать _CRTDBG_MAP_ALLOC, но имя файла и строку в файле получить не удается.
Помогите пожалуйста, если кто знает в чем здесь дело...
Здравствуйте, Wasilij, Вы писали:
W>У меня тоже эта же проблема, пробовал везде задать _CRTDBG_MAP_ALLOC, но имя файла и строку в файле получить не удается. W>Помогите пожалуйста, если кто знает в чем здесь дело...
Здравствуйте, Курилка, Вы писали:
К>Я вроде поставил и в библиотеке и в приложении кругом _CRTDBG_MAP_ALLOC, да нифига всё равно не получается строчки получить К>Можно с этим бороться или нет?
Я нашел ответ в книге Джона Роббинсона "Отладка приложений для Microsoft .net и Microsoft Windows", глава 17 — Стандарнтая отладочная библиботека С и управление памятью:
#define _CRTDBG_MAP_ALLOC
#define _CRTDBG_MAP_ALLOC_NEW
#include <stdlib.h>
// все остальные include#include <crtdbg.h> // этот include последний#ifdef _DEBUG
#ifndef NEW_INLINE_WORKAROUND
#define NEW_INLINE_WORKAROUND new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new NEW_INLINE_WORKAROUND
#endif// NEW_INLINE_WORKAROUND#endif// _DEBUG