江添亮のブログ, GitHub, 本の虫@GitHub, @EzoeRyou
new式の評価において、ストレージの確保が成功したが、初期化中に、コンストラクターから例外が投げられた場合、確保されたストレージは、対応するdeallocation functionで解放される・・・かもしれない(MAY)。
少なくとも、MSVCとGCCは、この挙動を実装していなかった。
再び試したところ、MSVCとGCCではplacement deleteが規格通りに呼び出された。何か間違えていたらしい。
> 少なくとも、MSVCとGCCは、この挙動を実装していなかった。そんなはず無いと思うんですが、どうやって確認されたんでしょう?
いま試したら、うまくいった。何か間違えていたらしい。
やっぱり。確認したところ、 "may" と書いてあるのは new 式全体についての話( N3092 では p8 )で、オブジェクト初期化中の例外については(対応する deallocation function が見つかる限り)必ず deallocation function が呼び出されることになっています( N3092 では p18 )。
そのようですね。
ううむ(-_-;)という事はEmbarcadero C++はやはり規格外の動作なんだろうか。operator new実行中にコンストラクタで例外を投げてもoperator deleteを呼び出してくれません。こういう規格外の動作が多いんでboostの移植も進まないんだろうな。
Post a Comment
5 comments:
> 少なくとも、MSVCとGCCは、この挙動を実装していなかった。
そんなはず無いと思うんですが、どうやって確認されたんでしょう?
いま試したら、うまくいった。
何か間違えていたらしい。
やっぱり。
確認したところ、 "may" と書いてあるのは new 式全体についての話( N3092 では p8 )で、オブジェクト初期化中の例外については(対応する deallocation function が見つかる限り)必ず deallocation function が呼び出されることになっています( N3092 では p18 )。
そのようですね。
ううむ(-_-;)
という事はEmbarcadero C++はやはり規格外の動作なんだろうか。
operator new実行中にコンストラクタで例外を投げてもoperator deleteを呼び出してくれません。
こういう規格外の動作が多いんでboostの移植も進まないんだろうな。
Post a Comment