2010-07-03

newと初期化失敗

new式の評価において、ストレージの確保が成功したが、初期化中に、コンストラクターから例外が投げられた場合、確保されたストレージは、対応するdeallocation functionで解放される・・・かもしれない(MAY)。

少なくとも、MSVCとGCCは、この挙動を実装していなかった。

再び試したところ、MSVCとGCCではplacement deleteが規格通りに呼び出された。何か間違えていたらしい。

5 comments:

  1. > 少なくとも、MSVCとGCCは、この挙動を実装していなかった。

    そんなはず無いと思うんですが、どうやって確認されたんでしょう?

    ReplyDelete
  2. いま試したら、うまくいった。
    何か間違えていたらしい。

    ReplyDelete
  3. やっぱり。

    確認したところ、 "may" と書いてあるのは new 式全体についての話( N3092 では p8 )で、オブジェクト初期化中の例外については(対応する deallocation function が見つかる限り)必ず deallocation function が呼び出されることになっています( N3092 では p18 )。

    ReplyDelete
  4. ううむ(-_-;)
    という事はEmbarcadero C++はやはり規格外の動作なんだろうか。

    operator new実行中にコンストラクタで例外を投げてもoperator deleteを呼び出してくれません。

    こういう規格外の動作が多いんでboostの移植も進まないんだろうな。

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.