次のように宣言された配列があるとします。
int* array;
そして、配列に多くの整数を入力します。
あとで言うなら
array = NULL;
これにより、配列内の数値が占有していたメモリが解放されますか、それともメモリがまだ残っている間は配列が使用できなくなりますか?
int* array;
は配列ではなく、ポインタです。この時点では配列はありません。の配列は言うまでもなく、有効なオブジェクトをarray[0] = 5;
指していないため、何かを開始することはできません。int
int
配列は次のようにして宣言されます。
int array[5];
この配列には、割り当てを開始する準備が整った 5 つのオブジェクトがあります。ただし、この配列はdであってはなりません。delete
配列は動的に割り当てられませんでした。
ただし、 を行った場合はint* array = new int[5];
、5 の配列を動的に割り当て、int
その配列の最初の要素へのポインターを取得します。この場合、する必要 delete[] array;
があります。NULL
またはへのポインターを設定せずにのみ設定するとnullptr
、メモリリークが発生するだけです。
コードを使用する場合
int *array;
array = NULL;
ポインタを初期化しました。*array にデータを代入する場合
int *array;
array[1] = 3;
未定義の動作が発生しますが、ほとんどの場合アクセス違反です。書き込み前にメモリを確保し、ポインタにNULLを代入する場合
int *array;
array = new int[3];
array[0] = 2;
array[2] = 4;
array = NULL;
メモリリークが発生します。データを削除すると、すべてがうまくいくはずです。
int *array;
array = new int[3];
array[0] = 2;
array[2] = 4;
delete[] array;
array = NULL;
new []
(変数の名前が であるためarray
) またはを使用してメモリを割り当てた場合new
、メモリ リークが発生します。
ポインタを に設定してNULL
もメモリは解放されず、ポインタが再割り当てされるだけです。つまり、以前に割り当てられたメモリを参照する機会が失われます。
delete[]
で割り当てられたメモリを解放するために使用しnew[]
、 で割り当てられたメモリを解放するために使用delete
しnew
ます。
ただし、生のポインターと手動のメモリ管理をまったく使用しないことを検討してください。ほとんどの場合、それらは必要なく、エラーが発生しやすくなります。C++ 標準ライブラリには、内部でメモリ管理を実行するコレクションとスマート ポインターが付属しており、この種の間違いからユーザーを保護します。
配列を NULL に設定しても、メモリは解放されません。
使用できる天候は、周囲のコードとarray
初期化の方法によって異なります。しかし、あなたはその情報を提供していないので、それ以外は憶測になります.
最新の C++ コードでポインターを使用することは珍しいことに注意してください。
より適切な構造を使用することを検討する必要があります。それが何であるかは、あなたの使用法によって異なります。名前だけに基づいていarray
ます。おそらくstd::vector<int>
(またはstd::array<int>
C++ 11)またはプレーンな古いC配列を使用する必要がありint array[5]
ます。
メモリがリークし、プロセスが終了したときにのみ解放されます。セグメンテーション違反が発生する可能性は十分にあります。
あなたが持っている場合:
int *array = new int[10];
使用する必要があります
delete [] array;
メモリを解放します。
基本的にルールに従います: new XXX
deallocate withdelete XXX
または for array allocationで割り当てるときはいつでもdelete [] XXX
。
をそのまま使用するとarray = NULL
、ポインタを に設定するだけでNULL
、メモリ リークが発生します。