2

プロジェクトのグローバルな new 演算子と delete 演算子をオーバーライドしましたが、Boost ライブラリですべてを機能させるのに問題があります。ここで解決策を実装しました:複数のオーバーロードで発生していた問題を回避するために、C++ 演算子 new を置き換えるマクロ。ただし、Boost ライブラリには、単純にプリプロセッサをそのままにして展開するのoperator newではなく、使用するという厄介な習慣があります。new

::operator new(n);

に:

::operator (__file__ = "someFile.cpp", __line__ = 123) && 0 ? NULL : new(n);

これらの「望ましくない」展開を削除する別のマクロを作成することは可能ですか? たとえば、次のように書いてみました。

#define (operator (file, line) && 0 ? NULL :) operator new

しかし、明らかに括弧はマクロの識別子部分では許可されていません。Boost ライブラリを使用しながらメモリ割り当てを追跡するにはどうすればよいですか?

4

1 に答える 1

1

良い答えは、これが何に必要かによって異なりますが、明らかに、デバッグに費やす時間を短縮するためです (どのブロックがどこに割り当てられたかに関する情報を取得することにより)。

次に、まず、割り当てと割り当て解除のデバッグにかかる​​時間を短縮する最も一般的な方法は、などのスマート ポインターstd::shared_ptrを使用することです。スマート ポインターが割り当て解除を自動的かつ正しく管理できるようにします。これにより、デバッグに費やす時間を大幅に削減できます。

つまり、必要な情報を取得する 1 つの方法は、それについて明確にすることです。あなたのコードでは、単に, in -expressionsTRACKING_NEWの代わりにeg を書いてください。次に、それに応じて定義します。newnewTRACKING_NEW

というマクロを定義しないでくださいnew

正式な問題 (その後に標準ヘッダーを含めると UB が発生する) は別として、ほぼ確実にトラップされます。そのため、たとえばTRACKING_NEWコードを変更してスマート ポインターを使用することが望ましいと判断した場合は、定義してください。ただし、 というマクロは定義しないでくださいnew

于 2012-08-21T03:56:15.213 に答える