2012-02-07 15 views
1

私は、プリミティブ型の値を動的に割り当てられた配列を削除したい場合:プリミティブ型のデストラクタは、動的に割り当てられた配列ですか?

int *it = new int[10]

は、私はちょうど適切にメモリを解放するの世話をするためにデストラクタでdelete [] itを置けばいいの?私は、この程度ではなく困惑している

for (size_t idx = 0; idx != 5; ++idx) 
     delete sp[idx]; 
    delete[] sp; 

:ポインタがプリミティブ型であるように、動的に割り当てられた配列を削除すると、デストラクタでこのような何かをやって関与しない、ことを実現

OR

私は私のプログラムで多くのメモリ関連のエラーが発生しています。

答えて

5

お持ちの場合:

int* it = new int[10]; 

正しい方法deleteには、次のとおりです。

delete[] it; 

あなたはコピーコンストラクタと代入演算子としてを実装する必要がありますが、このタイプのメンバ変数を使用している場合これらのデフォルトバージョンでは不十分であるか、クラスをコピー不可能にします。

これはC++なので、代わりにstd::vector<int>を使用することをお勧めします。これはメモリ管理を処理するためです。

+0

ありがとうございます。 – rrazd

2

newdeleteを使用する場合は、次に従います。newと同じくらい多く使用してください。deleteを入力してください。

あなたのケースでは、new[]を1回だけ呼び出しました。あなたは一度だけdelete[]を入力する必要があります。

さらに、メンバー変数にポインタを格納する場合は、Rule of Threeを考慮してください。

私は「あなたがnewdeleteを使うつもりなら、あなたはしばしばそうしてはいけないと言います。 RAII技術と標準的なコンテナを使用すると、直接newまたはdeleteを直接呼び出さない完全に有用なプログラムを書くことができます。

あなたはstd::vectorを使用し、intの配列を維持しようとしている場合:

class MyClass { 
    std::vector<int> it; 

    void SomeFun() { it.resize(10); } 
}; 

次に、あなたのデストラクタで、は何もしません。あなたの助けを借りずにベクトルが消えます。

関連する問題