マルチスレッド環境でnew演算子をオーバーロードし、その中にスレッドID、関数名、行番号を入れたいとします。これを行う方法はありますか?C++オーバーロードされた "new"演算子の行番号と関数名を取得する方法
答えて
新しいoperator new
オーバーロードすることができます:
void * operator new(std::size_t count, const char* file, int line)
{
// Do stuff
// ...
return ::operator new(count);
}
void * operator delete(void* p, const char* file, int line)
{
// Do stuff
// ...
return ::operator delete(p);
}
// ... and [] versions ..
その後、プレースメントの構文を使用することができます
auto x = new (__FILE__, __LINE__) Foo;
をそしてマクロを追加することができます。一般的には
#define TRACE_NEW new (__FILE__, __LINE__)
auto x = TRACE_NEW Foo;
いいえ、あなたは* placement new *をオーバーロードしていませんが、単純にグローバルな 'operator new'を追加し、' TRACE_NEW'でそれを使用しています。 [placement new](http://en.cppreference.com/w/cpp/language/new)は、たとえば'void * p = mmap(' .... '); auto x = new(p)Foo; ' –
@BasileStarynkevitchうん、" placement new "が間違っていた。スタンダードは、「配置割当機能」と呼んでいるが、明らかに同じものではない。おそらく、この言葉遣いが良いでしょう。 – molbdnilo
をあなたが望むことをする方法はありません(もちろん、moldbnilo answeredのようなマクロを使うことを除いてあなたは、最近のLinuxシステム上で、すべてのコード(及び場合はライブラリのほとんどデバッグオプションでコンパイルされている)libstdc++
を含めて、使用している場合、私は将来std::source_location)
しかし、あなたはまた、イアン・テイラーのlibbacktraceを検討するかもしれません(GCCの内部でも使用されています)、operator new
実装内で使用してください。そのlibbacktrace
はcall stackのコールフレームを検査し、DWARFデバッグ情報を使用することができます。
あなたはcall stack(特に発信元の場所はoperator new
)のほとんどの機能のソースの場所を持つことさえできます。
あなたは両方のデバッグ情報(例えば-g
)といくつかの最適化フラグ(例えば-O1
または多分-O2
)と(GCCまたはClangを使用して)いくつかのC++コードをコンパイルすることができますことを覚えておいてください。もちろん、デバッグ情報(DWARF)は "あいまい"であるかもしれませんが、実際にはほとんどの場合は実際に使用することができます。
ところで、おそらくvalgrindか、-fsanitize=address
instrumentation optionでコンパイルすることで消毒する必要があるかもしれません(あなたの疑問が動機付けされていないためわからない)。
- 1. C++ - オーバーロード演算子new
- 2. C++ std :: set Find関数オーバーロード==演算子
- 3. C++の演算子[]の演算子オーバーロードを書く方法
- 4. C++オーバーロード:[] []演算子のオーバーロード
- 5. オーバーロードされた演算子のオーバーロード
- 6. '+'演算子がC++でオーバーロードされる
- 7. 演算子とフレンド関数のオーバーロード
- 8. C++テンプレートとオーバーロード演算子
- 9. C++演算子+演算子+ =オーバーロード
- 10. C++:演算子オーバーロード、演算子+
- 11. C++オーバーロード演算子++
- 12. フレンドクラスとオーバーロードされた演算子
- 13. ネストされたクラスの演算子をオーバーロードする方法は?
- 14. 複素数演算のためのC++演算子のオーバーロード
- 15. オーバーロードされたポストインクリメント演算子内の変数の結果を使用してオーバーロードされたプリインクリメント演算子
- 16. C++:行列テンプレートの+ =演算子のオーバーロード
- 17. 演算子のオーバーロードまたは関数の作成(C++)
- 18. オーバーロードされた後置インクリメント/デクリメント演算子のostream演算子のオーバーロード
- 19. C++の演算子のオーバーロード
- 20. C++演算子+行列のオーバーロード
- 21. C++のオーバーロード()、[]演算子
- 22. C++演算子のオーバーロード[]
- 23. 演算子のオーバーロード+ C++
- 24. 演算子のオーバーロード== C++
- 25. C#のオーバーロード演算子==クラス
- 26. C++マップの演算子オーバーロード
- 27. C++演算子のオーバーロード順
- 28. C:++で演算子のオーバーロード「:=」
- 29. C++ - のオーバーロード[]演算子
- 30. オーバーロード時のサイズ情報C++ new演算子
http://en.cppreference.com/w/cpp/experimental/source_locationがあるまでは、MACROを使用する必要があります。 – Jarod42
[C/C++行番号](https://stackoverflow.com/questions/2849832/cc-line-number)の可能な複製 – user463035818
オペレータでこれを実行しようとすると、常に名前と行番号が取得されますここで 'operator new'が定義されていて、それが呼び出される場所ではありません。 –