8

Microsoft ランタイム ライブラリは、割り当て関数のデバッグ バージョンを提供します。C++ の場合、これは署名付きの演算子 new のデバッグ バリアントです。

void *operator new(size_t size, int blockType, const char *filename, int linenumber);

マクロは次のように定義されます

#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)

すべての割り当てを計測するために、通常は次のように定義します

#if defined DEBUG_NEW
#define new DEBUG_NEW
#endif

ただし、この定義は、placement new を使用するすべての場所を壊します。これは、2 つの引数セットが構文エラーになるためです。これで、コード内のいくつかの使用法を簡単に処理できるようになりましたが、標準ライブラリとブーストはいたるところに新しい配置を使用しています。したがって、これをグローバルに定義すると、定義の前に多くのものを含めることになり、コンパイルが遅くなります。

では、placement new が含まれているという理由だけで、すべてのファイルに上記の最後の定義を配置したり、手動で DEBUG_NEW を記述したりする必要なく、ヘッダーを取得せずにコードで割り当てを計測する方法はありますか?

4

5 に答える 5

7
#pragma push_macro("new")
#undef new

new(pointer) my_class_t(arg1, arg2);

#pragma pop_macro("new")

また

#pragma push_macro("new")
#undef new

#include <...>
#include <...>
#include <...>

#pragma pop_macro("new")
于 2014-02-07T15:02:58.327 に答える
4

私が歴史的にこれを解決した方法は、プリコンパイル済みヘッダーを使用し、次のようなことを行うことです (StdAfx.h、Pch.h、PreCompiled.h など):

//First include all headers using placement new
#include <boost/tuple/tuple.hpp>
#include <vector>

#define new MY_NEW
#define MY_NEW new(__FILE__, __LINE__)   

次に、ブースト ヘッダーが直接含まれているファイルはなく、プリコンパイル済みヘッダーのみが含まれていることを確認します。

于 2012-10-10T08:48:56.540 に答える
0

これがちょっと遅いことはわかっていますが、その問題はテンプレート マジックを使用することで解決できます。

私は最近、すべての配置の新しい呼び出しの前に書き込みを取得する新しいキーワード「配置」を追加する debug_new デバッガーをコーディングしています。

ここで私のデバッガーを確認できます: https://sourceforge.net/projects/debugnew/

または、nvwa の debug_new デバッガー: https://sourceforge.net/projects/nvwa/

于 2015-02-04T13:04:44.087 に答える
-1

define new DEBUG_NEW行は、すべての #include 行の後に、ソース ファイルに配置する必要があります。この方法では、独自のコードにのみ適用され、Boost などの他の h ファイルには適用されません。DEBUG_NEW 再定義に対するグローバルな新規は、コンパイルが失敗する可能性があるため、避ける必要があります。

于 2012-10-10T08:54:24.860 に答える