0

new 演算子を使用して要素を構築できる動的配列を「何らかの方法で」作成できるようにしたいと考えています。これが私が達成したいことです:

A* a = new A[3]; //or any equivalent syntax 
new (&a[0]) A(myparams1); //placement new on first slot 
new (&a[1]) A(myparams2, ...); //placement new on 2nd slot 
new (&a[2]) A(myparams3, ...); //placement new on 3rd slot
delete[] a; //correct deletion of all elements

aこのコードが機能することは承知していますが (上書きされた 3 つの要素を除いて)、最初の呼び出しで3 つの既定の要素を作成することは避けたいと思いますnew[]。ここでは、 を呼び出す前に常に3 つの要素を配置すると仮定していますdelete[]。へのインテリジェントな呼び出しを使用することで、そのようなことを達成できると考えていますA::operator new[]が、その方法はわかりません。誰にもアイデアはありますか?それは主に好奇心のためです

4

3 に答える 3

3

代わりに生のメモリを取得するだけです:

void* mem = ::operator new(capacity * sizeof(A));

これは、 の配列を含むすべてのタイプで整列する必要がありますA。これで、次のように構築できます。

for (std::size_t i = 0; i < capacity; ++i)
{
    void* addr = static_cast<char*>(mem) + i * sizeof(A);
    new (addr) A(x, y, z, ...);
}

破壊するには、明示的に呼び出す必要があります。

for (std::size_t i = 0; i < capacity; ++i)
{
    void* addr = static_cast<char*>(mem) + i * sizeof(A);
    static_cast<A*>(addr)->~A();
}

そして今、生のメモリを解放することができます:

::operator delete(mem);

これはどれも例外セーフではないことに注意してください。それはまたstd::vector<A>、コードをチェックしてください。

于 2012-05-11T22:09:00.820 に答える
2

演算子 new を使用します。

A a* = (A*) ::operator new(sizeof(A) * 3);
new (&a[0]) A(/* whatever */);
//do stuff
a[0].~A();
::operator delete(a);

デストラクタを手動で呼び出す場合は十分に注意してください。配置 new を使用する場合、デストラクタは自動的に呼び出されないため、あなた次第です。

于 2012-05-11T22:07:16.163 に答える
1

ポインタの配列を作成できます。

A ** a = new A*[3]
a[0] = new A;
a[1] = new A;
a[2] = new A;

delete割り当てられた各要素を呼び出す必要があります

delete a[2];
delete a[1];
delete a[0];

そして、アレイ自体を削除するにはdelete[] a;

于 2012-05-11T22:17:25.147 に答える