自分のメモリマネージャーのメモリ追跡と準備を試している間、新しい演算子をオーバーライドしようとしました。フリップコードに関する記事は、このプロセスの私の主要なガイドラインでした(http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml)。
その記事で説明されている手法を実装した後、STLのどこかに「crtdbg.h」が直接または間接的にインクルードされているヘッダーファイルの一部を介してインクルードされているという問題が残ります(Visual Studio 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
ます。
これは、新しい演算子にカスタム名を使用し、代わりにその名前を使用することによってのみ解決できると思います。私は正しいですか?