配列名をポインタとして使用してコードをコンパイルしたときに、delete
を使用して配列名を削除したとき、配列形式を使わずに配列を削除するという警告が出ました(正確な表現は覚えていません)。「削除」の配列形式は何ですか?
基本的なコードは以下のとおりであった:
int data[5];
delete data;
ので、削除の配列形式は何ですか?
配列名をポインタとして使用してコードをコンパイルしたときに、delete
を使用して配列名を削除したとき、配列形式を使わずに配列を削除するという警告が出ました(正確な表現は覚えていません)。「削除」の配列形式は何ですか?
基本的なコードは以下のとおりであった:
int data[5];
delete data;
ので、削除の配列形式は何ですか?
削除の配列形式は次のとおりです。
delete [] data;
編集:しかし、他の人が指摘したように、あなたはこのように定義されたデータのためのdelete
を呼び出すべきではありません。
int data[5];
あなたはあなたがこのようにnew
を使用してメモリを割り当てるときにのみ呼び出すべきです:
int *data = new int[5];
data
が指す配列に対して動的に割り当てられた領域を解放する場合は、予約語delete
と割り当てられた領域の先頭へのポインタの間に2つの角括弧[]
を入れなければなりません。 data
はメモリ内の1つのint
と、配列の最初の要素を指すことができるので、メモリ全体を削除することをコンパイラに知らせる唯一の方法です。正しい振る舞いをしないと振る舞いは「不定」(Stroustrup、C++プログラミング言語)です。
ここに示すコードは、スタックまたはデータセグメントの初期化された部分に配列を持ちます。つまり、割り当てを解除しません(他の部分で述べたように、 "未定義の動作"になります)。 「フリーストア」ではdelete [] data
でそれを行います。
はあなたのいずれかが必要:
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
演算子のどの形式にも渡すことはできません。
他が言ったように、あなたは、削除のベクトル形式を使用する必要がありますいくつかのコンパイラは警告を表示しないますので
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
そして、あなたはローカルスコープにメモリを扱っている場合は、内部バッファから割り当てますSTLSoftのauto_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
配列がnew []で割り当てられていないため、これは未定義の動作を呼び出します。 –