2010-07-03

newと初期化失敗

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

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

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

5 comments:

Anonymous said...

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

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

江添亮 said...

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

Anonymous said...

やっぱり。

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

江添亮 said...

そのようですね。

萌ゑ said...

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

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

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