2015-10-23 8 views
5

誰もが!delete []は要素ごとの削除と等しいですか? C++

私はArrayクラスを書いて、建設

data = reinterpret_cast<T*>(new char[sizeof (T) * size]); 
    for (int i = 0; i < size; ++i) { 
     new(&data[i]) T(some_value); 
} 

そして今、私が正しくメモリを解放する方法を思ったんだけど最適化したいんだとしましょう:

  1. delete[] data;

  2. for (int i = 0; i < size; ++i) { data_[i].~T(); }

+0

['std :: array'](http://en.cppreference.com/w/cpp/container/array)を書き直そうとしていますか? – NathanOliver

+0

割り当てられた配列がTの右揃えではない場合はどうなりますか? –

+0

@ NathanOliverもちろん、私はこれをやろうとはしていません:-)それは私の好奇心の強い想像です。 – aob

答えて

2

発現削除[]データは一致している必要があり、ヒープ上のアレイを作成新しいT []T*データの種類されるようになっています。それ以外の場合、プログラムの動作は未定義です(5.3.5)。

この例では、タイプがデータ*データは不明です。 Tcharでない場合、動作は未定義です。

あなたはコールも、ループ内でデストラクタを呼び出した後、[]データを削除しないでください。 delete [] reinterpret_cast < char * >(data)を呼び出すと、未定義の動作が回避されます。メモリを解放する前に、タイプTのデストラクタを呼び出す必要があります。

1

デストラクタを呼び出す前に、データをdeleteに転送する必要があります。

// First step 
for (int i = 0; i < size; ++i) { 
    data_[i].~T(); 
} 

// Second step 
delete [] data; 
0
// First, you must call the destructors, so that objects will be destroyed 
for (int i = 0; i < size; ++i) { 
    data_[i].~T(); 
} 

// Then, deallocate memory from the heap. 
delete[] data; 
関連する問題