While trying out some memory tracking and preparation for my own memory manager, I tried to override the new operator. The article on flipcode was my main guideline in this process ( http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml ).
After implementing the techniques described in that article, I am left with the problem that somewhere in the STL the "crtdbg.h" is being included either directly or indirectly through some of the header-files that are being included (Using Visual Studio 2010).
This results in an error:
[...]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
[...]
Doing a quick-check by placing the '_CrtDumpMemoryLeaks()' without including the header-files confirms my suspicion that the header-files are indeed incuded through the STL files.
// The header files that should be included for using the CrtDumpMemoryLeaks:
//#define _CRTDBG_MAP_ALLOC
//#include <stdlib.h>
//#include <crtdbg.h>
//...
_CrtDumpMemoryLeaks()
Leaving aside wether it's a good idea or not to implement my own new/delete, I am wondering how I can have my own new/delete implementations while still using some standard library functionality and not having these redefinition errors.
The code looks like this:
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;
}
The way I solved it is by moving the #define new DEBUG_NEW
below the <iostream>
;
The problem is resolved, since it won't rewrite the new in the crtdbg.h
; however this really makes it troublesome having to make sure that this is always being done after possible headers that include the crtdbg.h
file.
I believe this can only be resolved by using a custom name for the new operator and use that one instead. Am I correct?