(注:この質問は、この他の質問に答えるためのノーオペレーション割り当てを生成するためにプリプロセッサハッカーを考え出すことによって動機付けられました:
...それを覚えておいてください!)
考案されたクラスは次のとおりです。
class foo {
private:
int bar;
public:
foo(int bar) : bar (bar)
{ std::cout << "construct foo #" << bar << std::endl; }
~foo()
{ std::cout << "destruct foo #" << bar << std::endl; }
};
...これを次のように割り当てます:
// Note: for alignment, don't use char* buffer with new char[sizeof(foo)] !
void* buffer = operator new(sizeof(foo));
foo* p1 = new (buffer) foo(1);
foo* p2 = new (buffer) foo(2);
/* p1->~foo(); */ /* not necessary per spec and problematic in gen. case */
p2->~foo();
私が持っているgccで、「期待される」結果が得られます。
construct foo #1
construct foo #2
destruct foo #2
これは素晴らしいことですが、コンパイラ/ランタイムはこれを悪用として拒否し、それでも仕様の右側にある可能性がありますか?
糸脱毛はどうですか?このクラスの内容を実際に気にしない場合(とにかくダミーオブジェクトであるとしましょう)、POD intでこれを動機付けたさらに単純なアプリケーションのように、少なくともクラッシュすることはありませんか?