Я работаю над игрой с 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()
не может произвести номера строки при выделении использования 'нового' затем, предложения для других способов достигнуть подобного поведения ценятся.
Когда вы определяете _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
в файлах заголовков без «корректировки».
Вам могут понадобиться эти определения после ваших include
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
Посмотрите на кусок кода.
Перегрузка оператора new и оператора delete для регистрации всех выделений и деаллокаций памяти
Я определил свои утечки памяти с помощью этого метода.
Это старая версия Visual Leak Detector.
Попробуйте это: http://vld.codeplex.com/