2017-10-01 6 views
2

動的割り当てとポインタが初めてです。私は、ファイルから2Dダイナミック配列を記入し、それに迷路解決アルゴリズム(ウォールフォロワ)を適用しようとします。削除はいつ使用しますか? (動的に作成された2次元配列の後に削除しない場合の結果)

私はこのような動的に割り当てられた2次元配列を作成すると仮定:

int** board; 
board = new int* [rowsize]; 

for(int row = 0; row < rowsize; row++) 
{ 
    board[row] = new int[colsize]; 
} 

私は別の変数のためにこのポインタを使用しないことがわかっている場合は、私はboardで削除使用しないで逃げることができますか?潜在的に間違っている可能性がない場合(もしあなたがウォールフォロワアルゴリズムに精通しているなら)?また、ポインタへのポインタを削除するには、delete boardで十分でしょうか?

答えて

1

:あなたはnewに割り当てるすべてのポインタを削除する必要がありますか?

ありがとうございます:あなたのプログラムが割り当てた配列を繰り返し削除すると、メモリリークが発生し、プロセスがメモリ不足になります。

ポインタへのポインタを削除するには、delete boardで十分でしょうか?

いいえ、あなたはboard内で割り当てられ、保存されている各ポインタを削除する必要があります:

for(int row = 0; row < rowsize; row++) { 
    delete[] board[row]; 
} 
delete[] board; 

注角括弧をdeleteした後に、アレイを削除することを示すために、彼らは非常に重要です。

長方形の行列の割り当て解除メモリを割り当てることは、C++ライブラリでは解決された問題です。動的なリソース割り当てを避けるために、ベクトルのベクトルを使用するように切り替える:

std::vector<std::vector<int>> board(rowsize, std::vector<int>(colsize, 0)); 
+0

これは私が得意ではないものです。私は1つの目的のためだけにプログラムを使用すると仮定します。意味:ファイルからデータを読み、迷路を通り、パスを印刷して終了します。それでもメモリリークはどうですか?私はあなたが別の場所を指すためにポインタを使用すると、メモリリークを参照して、今すぐ前の場所にアクセスできないと思った。このような簡単なプログラムでは、「漏れた」メモリを視覚化するのに苦労しています。 –

+1

@LucAux 'new'と' delete'への呼び出しが私たちのバランスのときにメモリリークが発生します。あなたのプログラムが終了すると、OSはあなたのプログラムの後でメモリリーク、クローズされていないファイル記述子などを含む "混乱"を取り除きます。しかし、メモリプロファイラでコードを実行したい場合や、ループ内でコードを実行するために他の人がコードをコピーする場合は、自分でそれらを削除することをお勧めします。 – dasblinkenlight

1

割り当てた配列を削除しないと、プログラムが終了するまでメモリを消費し続けます。これは技術的に間違っているとは限りませんが、無駄です。

board - いいえ、削除では十分ではありません。私はboardで削除を使用しないで逃げることができ

for(int row = 0; row < rowsize; row++) 
{ 
    delete[] board[row]; 
} 
delete[] board; 
1

あなたがdeleteに必要なものは、あなた新しいを割り当てられたメモリです。これは、ポインタ自体の割り当てを解除するのではなく、ポインタが指しているヒープのメモリを解放することを意味します。

だから、delete[] boardする必要があります。これにより、配列int*が解放されます。この場合、[]を使用することは厳密には必須ではありません。基本的な型配列なので、必ず使用する必要はありませんが、配列には常に使用することをお勧めします。

アレイ上でdelete[]を呼び出すと、配列自体内のすべてのオブジェクトのデストラクタが呼び出され、配列が解放されます。しかし基本的なタイプの場合は必要ありません。

int** boardを無料にする必要はありません。ポインタはいくつかの特別な機能を持つ他の変数と同様の変数ですが、そのように宣言すると、他のスタックと同様にスタックに割り当てられます。

希望します。

関連する問題