2009-05-13 8 views
9

配列名をポインタとして使用してコードをコンパイルしたときに、deleteを使用して配列名を削除したとき、配列形式を使わずに配列を削除するという警告が出ました(正確な表現は覚えていません)。「削除」の配列形式は何ですか?

基本的なコードは以下のとおりであった:

int data[5]; 
delete data; 

ので、削除の配列形式は何ですか?

+3

配列がnew []で割り当てられていないため、これは未定義の動作を呼び出します。 –

答えて

33

削除の配列形式は次のとおりです。

delete [] data; 

編集:しかし、他の人が指摘したように、あなたはこのように定義されたデータのためのdeleteを呼び出すべきではありません。

int data[5]; 

あなたはあなたがこのようにnewを使用してメモリを割り当てるときにのみ呼び出すべきです:

int *data = new int[5]; 
+2

しかし、彼のint data [5]は演算子new()によって割り当てられなかったので、呼び出すことができる演算子delete()の正しい形式は存在しません。 – RBerteig

+1

興味深い...答えは正しいが、あまりにも間違っている。彼はどのようにして17票をすでに得たのですか? –

+2

質問されたはずの質問ではなく、実際に尋ねられた質問に簡単に答えることができます。特にそのタイトルと最後の文章の両方で繰り返されるとき。 – RBerteig

0

dataが指す配列に対して動的に割り当てられた領域を解放する場合は、予約語deleteと割り当てられた領域の先頭へのポインタの間に2つの角括弧[]を入れなければなりません。 dataはメモリ内の1つのintと、配列の最初の要素を指すことができるので、メモリ全体を削除することをコンパイラに知らせる唯一の方法です。正しい振る舞いをしないと振る舞いは「不定」(Stroustrup、C++プログラミング言語)です。

2

ここに示すコードは、スタックまたはデータセグメントの初期化された部分に配列を持ちます。つまり、割り当てを解除しません(他の部分で述べたように、 "未定義の動作"になります)。 「フリーストア」ではdelete [] dataでそれを行います。

13

はあなたのいずれかが必要:

int *data = new int[5]; 
... // time passes, stuff happens to data[] 
delete[] data; 

または

int data[5]; 
... // time passes, stuff happens to data[] 
// note no delete of data 

属のルールは次のとおりです。唯一newから来たメモリへdeleteを適用します。 newの配列形式を使用した場合、の配列形式を使用してdeleteと一致させる必要があります。プレースメントnewを使用した場合は、deleteを決して呼び出しないでください。一致するプレースメントdeleteを使用してください。

変数int data[5]は静的に割り当てられた配列なので、delete演算子のどの形式にも渡すことはできません。

3

他が言ったように、あなたは、削除のベクトル形式を使用する必要がありますいくつかのコンパイラは警告を表示しないますので

void some_func(size_t n) 
{ 
    int* data = new int[n]; 

    . . . // do stuff with the array 

    delete [] data; // Explicitly free memory 
} 

は、この非常に警戒してください。

さらに新しく/削除するベクターを使用する必要はほとんどありません。あなたのコードは、STDを利用するように変更することができるかどうか考えてみましょう::ベクトル:

void some_func(size_t n) 
{ 
    std::vector<int> data(n); 

    . . . // do stuff with the array 

} // memory held by data will be freed here automatically 

そして、あなたはローカルスコープにメモリを扱っている場合は、内部バッファから割り当てますSTLSoftauto_bufferを、使用することを検討してください可能であればそれができない場合のみ、ヒープに行き、(インスタンスの一部として、スタックに開催された):

void some_func(size_t n) 
{ 
    stlsoft::auto_buffer<int, 10> data(n); // only allocates if n > 10 

    . . . // do stuff with the array 

} // memory held by data will be freed here automatically, if any was allocated 

を読むmore about auto_buffer

関連する問題