web-dev-qa-db-ja.com

C ++でのdeleteとdelete []の違い

可能性のある複製:
C++での削除と削除[]演算子

2つのポインターを含むクラスを作成しました。1つはchar* color_で、もう1つはvertexesset* vertex_にあります。ここで、vertexessetは私が作成したクラスです。冒頭に書いたデストラクタで

delete [] color_;
delete [] vertex_;

デストラクタになると、セグメンテーション違反が発生しました。

次に、デストラクタを次のように変更しました。

delete [] color_;
delete vertex_;

そして今それはうまく働きます。 2つの違いは何ですか?

35
SIMEL

君は delete []配列型をnewedしたとき、および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 [].
59
etarion

deletedelete[]は同じものではありません!ウィキペディア 説明 これは簡単に言えば。つまり、delete []は、割り当てられた配列のデストラクタon every elementを呼び出しますが、deleteは、インスタンスが1つだけあると想定します。配列はnew foo[]で割り当て、delete[]で削除する必要があります。通常のオブジェクトの場合、newおよびdeleteを使用します。配列以外でdelete[]を使用すると、混乱を招く可能性があります。

19
EmeryBerger
  • Malloc()で割り当てる場合は、free()を使用します
  • Newで割り当てる場合は、deleteを使用します
  • New []で割り当てる場合は、delete []を使用します
  • Placement-newで構築する場合は、デストラクタを直接呼び出します
  • New []ではなくvectorを使用することに意味がある場合は、それを使用してください。
  • スマートポインターを使用するのが理にかなっている場合は、それらを使用し、deleteを呼び出さないでください(ただし、newを呼び出す必要があります)。一致する削除は、スマートポインターになります。

https://isocpp.org/wiki/faq/freestore-mgmt

7
CashCow

演算子new [](動的配列など)を使用してヒープにメモリを割り当てた場合は、delete []を使用する必要があります。

Operator newを使用した場合は、大括弧なしのoperator deleteを使用する必要があります。

組み込みタイプやカスタムクラスの削除とは関係ありません。

5
Francesco

オブジェクトへのポインタに割り当てられたメモリを解放したい場合、「削除」が使用されます。

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;でもメモリを解放できますが、解放されるのは最初の要素のメモリのみです。

4
Dorababu Meka

Effective C++ part 1 がある場合は、アイテム#5を参照してください。newとdeleteの対応する使用には同じフォームを使用します。

1
yasouser

レイモンドチェンは、スケーラーとベクトルの削除がどのように機能するかについての詳細な説明を スカラーとベクトルの不一致と新規の削除 というタイトルの彼のブログで提供しています。

上記の記事で誤ってリンクされているInformIT記事へのリンクは次のとおりです。 http://www.informit.com/articles/article.aspx?p=30642

1
Tergiver

そして今それはうまく働きます。

運が良ければ、その判断で幸運を祈ります。そして、それが本当に機能していることを確信していますか?

すべてのオブジェクトのデストラクタを呼び出す必要があります。delete[]演算子は、new[]によって設定された情報を使用して、破棄するオブジェクトの数を決定します。したがって、deleteはそれ自体でメモリを回復する可能性がありますが(それが実装に依存するかどうかは関係ありません)、割り当てられたオブジェクトごとにデストラクタを呼び出すことはできません。

newまたはnew[]が呼び出されたときにオブジェクトの割り当て方法に関する情報が含まれる可能性があるため、正しい形式の削除が使用されますが、これも実装に依存し、保証されません。 。

0
Clifford

加えて(明らかに私のタイピング速度を改善する必要があります:)、本当にする必要がない場合はnot usingポインタを検討してください。例えばchar*std::stringに置き換えることができ、vertexessetメンバーが多態性でない場合は、メンバーオブジェクトにすることができます。この場合、deleteはまったく必要ありません。

0
davka