new[]
これには表現を使用しないでください。それはベクトルの仕組みではありません。あなたがすることは、生メモリのチャンクを割り当てることです。これには malloc を使用するか、 new 式とは異なるoperator newを使用できます。デフォルトのアロケータを使用したと仮定すると、これは基本的に のreserve()
メンバー関数が行うことです。std::vector
式のように実際のオブジェクトを作成することはありませんnew[]
。
要素を構築する場合は、配置 newを使用して、割り当てた生メモリ内のどこかに場所を渡します。要素を破棄する場合は、そのデストラクタを直接呼び出します。delete[]
完了したら、式を使用する代わりに、operator delete
if you usedoperator new
を使用するか、 free()
if you used を使用しmalloc
ます。
以下は、10 個のオブジェクトを作成し、それらを逆の順序で破棄する例です。それらを任意の順序で破棄できますが、これはベクトル実装で行う方法です。
int main()
{
void * storage = malloc(sizeof(MyClass) * 10);
for (int i=0; i<10; ++i)
{
// this is placement new
new ((MyClass*)storage + i) MyClass;
}
for (int i=9; i>=0; --i)
{
// calling the destructor directly
((MyClass*)storage + i)->~MyClass();
}
free(storage);
}
pop_back
最後の要素のデストラクタを呼び出し、size メンバー変数を 1 減らすだけで実装されます。メモリを解放するべきではありません (また、不要なコピーを大量に作成しないと解放できません)。