2017-01-14 25 views
4

まあ、私はこれが純粋な悪の音だと知っています。私はthis SO postを読んでいて、スタックオブジェクトを再構築する技術に遭遇しました。スタックオブジェクトを再構築する

{ 
    T obj(...); // dtor will be called at end of scope 
    obj.~T(); // YOLO 

    new (&obj) T(...); 
    // obj goes out of scope. The compiler inserts `obj.~T();` here. 
} 

...私たちが好きなだけ同じメモリチャンクを再利用できるように、基本アイデアは次のとおりです。このコードは標準で合法ですか?このような狂気は未定義の行動ですか?

+0

新しいプレースメントのコンストラクタが例外をスローするとどうなりますか?デストラクタが2度呼び出すオブジェクトがありますか? – MRB

+0

標準ライブラリでは、この「テクニック」が全面的に使用されていますが、@ MMRBのような例外保証のようないくつかの処理が行われます。事が間違っている可能性がありますこれをしないでください。 – DeiDei

答えて

2

この構成は、placement newを適用します。 See also。第1規格以降は標準C++ です。これは、最初の標準よりも前であり、そのusefulnessのために のコア言語に導入されました。そうではない "狂気" と自然にUB それはではありません。もちろん、具体的な プレースメントの新しいアプリケーションでUBやその他のメモリ不具合を不注意に誘発するかもしれません。すべての未使用メモリ管理機能が言語によって提供されているように、標準ライブラリ とサードパーティライブラリの実装者は、 のリスクを抱える必要があります。