可能性のある複製:
C++での削除と削除[]演算子
2つのポインターを含むクラスを作成しました。1つはchar* color_
で、もう1つはvertexesset* vertex_
にあります。ここで、vertexesset
は私が作成したクラスです。冒頭に書いたデストラクタで
delete [] color_;
delete [] vertex_;
デストラクタになると、セグメンテーション違反が発生しました。
次に、デストラクタを次のように変更しました。
delete [] color_;
delete vertex_;
そして今それはうまく働きます。 2つの違いは何ですか?
君は delete []
配列型をnew
edしたとき、およびdelete
していないとき。例:
typedef int int_array[10];
int* a = new int;
int* b = new int[10];
int* c = new int_array;
delete a;
delete[] b;
delete[] c; // this is a must! even if the new-line didn't use [].
delete
とdelete[]
は同じものではありません!ウィキペディア 説明 これは簡単に言えば。つまり、delete []
は、割り当てられた配列のデストラクタon every elementを呼び出しますが、delete
は、インスタンスが1つだけあると想定します。配列はnew foo[]
で割り当て、delete[]
で削除する必要があります。通常のオブジェクトの場合、new
およびdelete
を使用します。配列以外でdelete[]
を使用すると、混乱を招く可能性があります。
演算子new [](動的配列など)を使用してヒープにメモリを割り当てた場合は、delete []を使用する必要があります。
Operator newを使用した場合は、大括弧なしのoperator deleteを使用する必要があります。
組み込みタイプやカスタムクラスの削除とは関係ありません。
オブジェクトへのポインタに割り当てられたメモリを解放したい場合、「削除」が使用されます。
int * p;
p=new int;
// now to free the memory
delete p;
しかし、次のようなオブジェクトの配列にメモリを割り当てた場合
int * p= new int[10]; //pointer to an array of 10 integer
次に、10個の整数に等しいメモリを解放します。
delete []p;
注:delete p;
でもメモリを解放できますが、解放されるのは最初の要素のメモリのみです。
Effective C++ part 1 がある場合は、アイテム#5を参照してください。newとdeleteの対応する使用には同じフォームを使用します。
レイモンドチェンは、スケーラーとベクトルの削除がどのように機能するかについての詳細な説明を スカラーとベクトルの不一致と新規の削除 というタイトルの彼のブログで提供しています。
上記の記事で誤ってリンクされているInformIT記事へのリンクは次のとおりです。 http://www.informit.com/articles/article.aspx?p=30642
そして今それはうまく働きます。
運が良ければ、その判断で幸運を祈ります。そして、それが本当に機能していることを確信していますか?
すべてのオブジェクトのデストラクタを呼び出す必要があります。delete[]
演算子は、new[]
によって設定された情報を使用して、破棄するオブジェクトの数を決定します。したがって、delete
はそれ自体でメモリを回復する可能性がありますが(それが実装に依存するかどうかは関係ありません)、割り当てられたオブジェクトごとにデストラクタを呼び出すことはできません。
new
またはnew[]
が呼び出されたときにオブジェクトの割り当て方法に関する情報が含まれる可能性があるため、正しい形式の削除が使用されますが、これも実装に依存し、保証されません。 。
加えて(明らかに私のタイピング速度を改善する必要があります:)、本当にする必要がない場合はnot usingポインタを検討してください。例えばchar*
はstd::string
に置き換えることができ、vertexesset
メンバーが多態性でない場合は、メンバーオブジェクトにすることができます。この場合、delete
はまったく必要ありません。