の代わりにマクロを使用してnew
、デバッグ モードで追加情報を取得します。
#if defined(_DEBUG)
#define SAGE_NEW new(__FUNCTION__, __FILE__, __LINE__)
#else
#define SAGE_NEW new
#endif
これは、カスタム メモリ プロファイリングとメモリ リーク検出に非常に役立つことがわかりました。共有ポインターの使用を開始したばかりなので、次のようなヒープ オブジェクトを作成しています。
auto myThingy = std::shared_ptr<Thingy>(SAGE_NEW Thingy(Args) );
std::make_shared
使用するメモリ割り当てが少ないため、優先されることを知りました。に私のものを含める方法はありますSAGE_NEW
かmake_shared
? リーク検出には問題ないことはわかっていますが、メモリ使用量の統計には引き続き使用したいと思います。allocate_shared
なんとなく答えが見えてきたような気がしますが、私にはわかりませんでした。ありがとう!:)
編集:について質問する人へnew
-私はカスタムでそれをオーバーロードしますnew
。コンパイラ オプション SAGE_MEM_INFO は、リーク検出とメモリ使用統計をオンにします。それ以外の場合は、ログをスキップしてメモリ プールの割り当てに直接移動します。new[] と delete[] のバリアントがありますが、簡潔にするために省略しています。
#ifdef SAGE_MEM_INFO
void* operator new (size_t size){ ++appAllocs; return myAlloc(size); }
void* operator new (size_t size, char const *function, char const *filename, int lineNum)
{
... Log memory usage
void* ptr = ::operator new(size);
return ptr;
}
void operator delete (void* ptr)
{
... Log freeing of this pointer
--appAllocs;
myFree(ptr);
}
void operator delete (void* ptr, char const *function, char const *filename, int lineNum)
{
... Log freeing of this pointer
--appAllocs;
myFree(ptr);
}
#else
void* operator new (size_t size){ return myAlloc(size); }
void* operator new (size_t size, char const *function, char const *filename, int lineNum)
{
void* ptr = ::operator new(size);
return ptr;
}
void operator delete (void* ptr) { myFree(ptr); }
void operator delete (void* ptr, char const *function, char const *filename, int lineNum) { myFree(ptr); }
#endif