「関数の再定義エラー」は、おそらく MFC を使用しているためです。
ランタイム ライブラリは、そのような割り当ておよび割り当て解除関数を定義する業務に従事すべきではありません。
現在のコードの
struct MemLeakInfo
{
unsigned int addr;
unsigned int line;
unsigned int size;
unsigned char file;
};
悪いです。Anunsigned int
は、32 ビット Windows であっても、アドレスを保持するのに十分な大きさであるとは限りません。代わりに、を使用してintptr_t
ください。
また、現在のコードの
void* operator new(unsigned int Size, int Line, const char* File);
悪いです。それは…
void* operator new( size_t Size, int Line, const char* File );
そして、あなたはoperator delete
…のような対応する必要があります
void* operator delete( void* p, int Line, const char* File );
失敗したコンストラクター呼び出しからメモリの割り当てを解除するため。その非常に特定の状況でのみ呼び出されます。しかし、それがない場合は、MFC がかつてデバッグ ビルドで使用していたように、リークが発生しています。
EDIT:あなたが今提供したコードの修正バージョン:
ファイル [minimal.h]:
_MINIMAL_H
アンダースコアで始まり、その後に予約されている大文字が続くため、無効です。に変更MINIMAL_H
。
- 使用
size_t
するには、 を含める必要があります<stddef.h>
。
_DEBUG
標準マクロではありません。それはマイクロソフト主義です。assert
この目的のための標準マクロ ( のドキュメントを参照) は ですNDEBUG
。
#ifndef MINIMAL_H
#define MINIMAL_H
#include <stddef.h> // std::size_t
#ifndef NDEBUG
void* operator new( size_t Size, int Line, const char* File );
void* operator new[]( size_t Size, int Line, const char* File );
void operator delete( void* ptr, int Line, const char* File );
void operator delete[]( void* ptr, int Line, const char* File );
#endif
#ifndef NDEBUG
#define DEBUG_NEW new( __LINE__, __FILE__ )
#else
#define DEBUG_NEW new
#endif
#endif //MINIMAL_H
ファイル [minimal.cpp]:
- 使用
malloc
するには、 を含める必要がありますstdlib.h
。
- 次のコードのキーワードで
#define new
大混乱を引き起こしている場合。new
- C ではの結果を決してキャストしないでください
malloc
。C++ では、必要な場合にのみ何かをキャストする必要があります。ここではそのような必要はありません。はマスク バグのみをキャストしますが、これはお勧めできません。
- エラーの場合にリターンがありません。エラーの場合は、する必要があります
throw std::bad_alloc
。これは、これらの関数の神聖な標準の仕様によるものです。
#include "Minimal.h"
//#define new DEBUG_NEW
#ifndef NDEBUG
#include <stdlib.h> // malloc
#include <exception> // std::bad_alloc
void* operator new( size_t const size, int, const char*)
{
void* const ptr = malloc( size );
if( !ptr ) { throw std::bad_alloc(); }
return ptr;
};
void* operator new[]( size_t const size, int, const char*)
{
void* const ptr = malloc( size );
if( !ptr ) { throw std::bad_alloc(); }
return ptr;
}
void operator delete(void* const ptr, int, const char*)
{
free( ptr );
};
void operator delete[]( void* const ptr, int, const char* )
{
free( ptr );
};
#endif