2011-12-13 20 views
0

このdocumentは、次のテキストとコードが含まれています:誰かがこのMSテキストが伝えようとしていることを説明できますか?

あなたはnew演算子の配置新しいフォーム、割り当てのサイズに加えて、引数を持つフォームを使用している場合、コンパイラはの配置形式をサポートしていません。コンストラクタが例外をスローする場合は、演算子を削除します。例:上述した第2のコメント行で表現したよう

// expre_new_Operator2.cpp 
// C2660 expected 
class A { 
public: 
    A(int) { throw "Fail!"; } 
}; 
void F(void) { 
    try { 
     // heap memory pointed to by pa1 will be deallocated 
     // by calling ::operator delete(void*). 
     A* pa1 = new A(10); 
    } catch (...) { 
    } 
    try { 
     // This will call ::operator new(size_t, char*, int). 
     // When A::A(int) does a throw, we should call 
     // ::operator delete(void*, char*, int) to deallocate 
     // the memory pointed to by pa2. Since 
     // ::operator delete(void*, char*, int) has not been implemented, 
     // memory will be leaked when the deallocation cannot occur. 

     A* pa2 = new(__FILE__, __LINE__) A(20); 
    } catch (...) { 
    } 
} 

int main() { 
    A a; 
} 

は、コードが
C2660を発する:「演算子新しい」:いいえオーバーロードされた関数は3つの引数

を取る
+0

コンパイルエラーを修正するために '#include 'を追加してください。 –

+0

''を含み、 'main()'の 'A a;'を 'F();に変更しましたが、コードはまだC2660を出力します。 – Belloc

答えて

1

結末は、あなたが常に実装する必要があることです一致するペアのoperator new()operator delete()のカスタムバージョン。何の「配置-delete式」がないので、これは最初に、不必要に思えるかもしれません:配置 - 新・構築されたオブジェクトを破壊する唯一の方法は、デストラクタを手動で起動することです:

A * p = new (addr, true, BLUE) A(1, 'a', x); 
// uses void * A::operator new(std::size_t, void *, bool, EnumColour) to 
// allocate, then invokes constructor A::A(int, char, X) with "this = p". 

// ... it's almost over ... 

p->~A(); // now it's over! 

あなたはこれを見て仮想的な「delete (addr, true, BLUE) p」がないことがわかります。では、なぜvoid A::operator delete(void *, bool, EnumColour)を実装する必要がありますか?答えは正確にあなたが引用されたテキストで説明した状況である:その場合

struct A { 
    A(int, char, X) { throw std::runtime_error("Boo!"); } 
    // ... 
    static void operator delete(void *, bool, EnumColour) noexcept; 
}; 

:オブジェクトのコンストラクタが例外をスローする場合、コンパイラは自動的に一致削除機能を起動しようとします関数が存在しない場合、関数は全く呼び出されません。したがって、何らかの理由でリソースのクリーンアップ(プールポインタの移動や空きリストの更新など)が必要な場合は、これは発生しません。

+0

コードスニペットのコメントはそれを暗示しているようですが、私が分かる限り、付随するテキストが何を言っているかはまったくありません。付随するテキストは単に間違っていますか? – ruakh

+0

@ruakh:その文はかなり混乱しています。私は単にそれを無視するだろう。彼らは "演算子"と "式"を混同しています...まあ、配置削除式は決してありませんので、これは "サポートされている"ものではないということについての質問ではありません。 –

+0

私はあなたが何を意味するのか見ています。 。 。知りません。その文章は、文書全体の文脈ではより意味をなさないと思います。これは、「余分な引数なしで演算子** new **を使用し、/ GX、/ EHa、または/ EHsオプションを指定すると、コンストラクタが例外をスローした場合、** delete **演算子を呼び出すコードが生成されます。したがって、ここでのポイントは、配置newが例外をスローするコンストラクタを使用する場合、コンパイラ*が配置削除を呼び出さないということです。 – ruakh

関連する問題