2

MyClass のヘッダー ファイルで次のように宣言できます。

void* operator new(size_t size) throw(bad_alloc);

MyClass ソース ファイルで次のように定義します。

void* MyClass::operator new(size_t size) throw(bad_alloc)
{
    cout << "overloading new" << endl;
    return (::operator new(size));
}

そしてこれを使用するには:

MyClass *m = new MyClass();

だから私の質問は - オーバーロードされた new 演算子を使用する上記のコード行では、タイプ size_t のサイズ引数をオーバーロードされた new 演算子に渡しているのが見えませんか?? しかし、オーバーロードされた新しい演算子の定義では、それが必要ですか?

4

1 に答える 1

4

簡単な回答 new 演算子で作成されたオブジェクトのサイズに応じて、コンパイラからサイズが推測されます。

struct Example {
    int X;
    int Y;
}

Example *A = new Example();

パラメータサイズが8(x64システムでは16)に等しい新しい演算子/関数を呼び出しますが、アライメントに応じて多少大きくなる場合もあります。

新しい呼び出しは、コンパイラから次のように変換されます (コンストラクタで例外が使用されておらず、コンパイラが不要な catch ブロックのキャッチを最適化することを決定した場合)。

Example *A = (Example*)Example::new(sizeof(Example));
A->A(); // call constructor
于 2013-04-07T01:13:10.310 に答える