При попытке отслеживания памяти и подготовки моего собственного менеджера памяти я попытался переопределить новый оператор. Моим основным ориентиром в этом процессе была статья о флипкоде (http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml).
После реализации методов, описанных в этой статье, я остаюсь с проблемой, что где-то в STL "crtdbg.h" включается прямо или косвенно через некоторые из заголовочных файлов, которые включены (Использование Visual Студия 2010).
Это приводит к ошибке:
[...]10.0\vc\include\crtdbg.h(1078): error C2365: 'operator new' : redefinition; previous definition was 'function'
[...]10.0\vc\include\crtdbg.h(1078): error C2078: too many initializers
[...]
Выполнение быстрой проверки путем размещения _CrtDumpMemoryLeaks () без включения заголовочных файлов подтверждает мое подозрение, что заголовочные файлы действительно внедряются через файлы STL.
// The header files that should be included for using the CrtDumpMemoryLeaks:
//#define _CRTDBG_MAP_ALLOC
//#include <stdlib.h>
//#include <crtdbg.h>
//...
_CrtDumpMemoryLeaks()
Если оставить в стороне, что это хорошая идея, или не реализовывать свои собственные новые / удалять, мне интересно, как я могу иметь свои собственные новые / удаляемые реализации, при этом все еще используя некоторые стандартные функции библиотеки и не имея этих ошибок переопределения.
Код выглядит так:
memdebug.h
#ifndef _MEM_DEBUG_H
#define _MEM_DEBUG_H
#ifdef _DEBUG
void * operator new( unsigned int size, const char *filename, int line );
void operator delete( void *ptr );
#define DEBUG_NEW new(__FILE__, __LINE__)
#define new DEBUG_NEW
#endif
#endif
memdebug.c
#ifdef _DEBUG
void * operator new( unsigned int size, const char *filename, int line )
{
void *ptr = (void *)malloc(size);
//AddTrack((DWORD)ptr, size, filename, line);
return(ptr);
};
void operator delete( void *ptr )
{
//RemoveTrack( (DWORD)ptr );
free( ptr );
}
#endif
main.cpp
#include "memdebug.h"
#include <iostream>
void main()
{
Test *pTest = new Test();
std::cout << "end" << std::endl;
}
Я решил это, переместив #define new DEBUG_NEW
ниже <iostream>
;
Проблема решена, так как она не будет перезаписывать новую в crtdbg.h
; тем не менее, это действительно затрудняет необходимость убедиться, что это всегда делается после возможных заголовков, включающих файл crtdbg.h
.
Я полагаю, что это можно решить только с помощью пользовательского имени для нового оператора и используйте его вместо этого. Я прав?