placement new も知っているよと思ったら長年の疑問を解消してくれた。

class Foo
{
public:
    Foo() { cout << "Foo()" << endl; }
    Foo(int n) { cout << "Foo(" << n << ")" << endl; }
};

のようなクラスがあったとして Foo(n) で初期化した Foo を配列に入れたい。

//  Foo* manyFoo = new Foo[50]; // Foo() が呼ばれてしまい悲しい

Foo* manyFoo2 = reinterpret_cast<Foo*>(new char[sizeof (Foo) * 50]);

for (int i = 0; i < 50; i++) {
    manyFoo2[i] = Foo(i);
    manyFoo2[i].~Foo(); // 明示的にデストラクタを呼ぶ
}

delete[] manyFoo2;
ロベールのC++入門講座を読んで C++ を初歩の初歩から再入門するよ - 後編 - Higepon’s blog - Mona OS and Mosh
1ヶ月前に投稿されました. リアクションが0件あります.