MSVC9.0でコンパイルされた次のコードは、Destructorを4回実行して出力します。これは、論理的です。
#include <iostream>
class SomeClass
{
public:
void CommitSuicide()
{
delete this;
}
void Reincarnate()
{
this->~SomeClass();
new (this) SomeClass;
}
~SomeClass()
{
std::cout << "Destructor\n";
}
};
int main()
{
SomeClass* p = new SomeClass;
p->CommitSuicide();
p = new SomeClass;
p->Reincarnate();
p->~SomeClass(); //line 5
p->CommitSuicide();
}
mainの最初の4行のコードは、未定義の動作を引き起こさないと思います(ただし、完全にはわかりませんdelete this;
)。その確認または<確認の反意語のプレースホルダー>が欲しいのですが。しかし、5行目と6行目については深刻な疑問があります。デストラクタを明示的に呼び出すことは許可されていますね。しかし、オブジェクトの存続期間はその後終了したと見なされますか?つまり、デストラクタの明示的な呼び出し後の別のメンバーの呼び出しは許可されていますか(定義されています)?
要約すると、上記のコードのどの部分(存在する場合)が未定義の動作(技術的に言えば)をもたらしますか?