大規模なコードベースでグローバルな「new」および「delete」演算子を普遍的にオーバーライドする方法は?

Barbara Streisand
リリース: 2024-11-03 13:08:02
オリジナル
660 人が閲覧しました

How to Universally Override Global `new` and `delete` Operators in Large Codebases?

グローバル New 演算子と Delete 演算子を効果的にオーバーライドする

問題:

グローバル New 演算子と Delete 演算子を置き換えるカスタム メモリ管理を使用するために削除演算子を使用すると、大規模なコードベースでは課題が生じます。オーバーロードを含むヘッダー ファイルをすべてのファイルに含めるのは現実的ではありません。これらのオーバーロードを確実に広く採用するにはどうすればよいでしょうか?

解決策:

new 演算子と delete 演算子のオーバーライドは、リンク時に実行されるプロセスです。演算子を定義する別の変換単位 (TU) を作成し、それをプロジェクトにリンクすると、既存のコードベースを変更せずにデフォルトの演算子をグローバルに置き換えることができます。

コード サンプル:

ここでは、new 演算子と delete 演算子を定義する TU の例を示します。

<code class="cpp">// optional_ops.cpp

void * operator new(std::size_t n) throw(std::bad_alloc)
{
  //...
}

void operator delete(void * p) throw()
{
  //...
}</code>
ログイン後にコピー

を含みます。演算子 new と演算子 delete の宣言は言語にハードコードされているため、ヘッダーは必要ありません。ただし、std、std::bad_alloc、std::size_t などの名前を宣言する必要がある場合があります。

C 11 以降の代替:

C 11 decltype(sizeof(0)) を使用してサイズ パラメーターの型を決定する、新しいオーバーロードを定義する簡単な方法を紹介します:

<code class="cpp">void * operator new(decltype(sizeof(0)) n) noexcept(false)
{
  //...
}</code>
ログイン後にコピー

以上が大規模なコードベースでグローバルな「new」および「delete」演算子を普遍的にオーバーライドする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート