2

次のコード スニップがあります。

int nWidth = 10;
int *pData = new int[nWidth];
//I do something here
//then I free memory by:
delete pData;

このコードのスニップはメモリ リークを引き起こしますか? 使用する必要がありますか:

delete[] pData;
4

4 に答える 4

13

使用しない場合delete[] pDataの動作は未定義です。メモリ リークが発生する可能性があり、プログラムがクラッシュする可能性があり、最も重要な顧客のためにプログラムのデモを行うまで問題なく動作する可能性があります。

于 2012-09-01T15:31:38.137 に答える
7

このコードのスニップはメモリ リークを引き起こしますか?

いいえ、それは未定義の動作をします。これはさらに悪いことです。

使用する必要がありますか:delete[] pData;

はい、で割り当てられたすべてのメモリは、new[]で解放する必要がありますdelete[]。ただし、早期復帰または例外によってプログラムが削除式に到達できない場合は、依然としてメモリ リークが発生します。

特別なことをしていない限り、メモリを明示的に管理する必要はほとんどありません。この場合、標準ライブラリは便利な動的配列型を提供します。

#include <vector>

std::vector<int> data(nWidth);
// Do something here.
// Memory is freed automatically when data goes out of scope.
于 2012-09-01T15:35:47.013 に答える
4

はい、使用する必要があります:

delete[] pData;

動的割り当てに関して次の点に注意してください。

  1. 動的割り当てをできるだけ避ける
  2. delete[]を使用してメモリを割り当てた場合は、使用する必要がありますnew[]
  3. deleteを使用してメモリを割り当てた場合は、使用する必要がありますnew
  4. free()を使用してメモリを割り当てた場合は、使用する必要がありますmalloc()
  5. 上記3つのすべてにおいて、割り当て関数から返された同じアドレスを割り当て解除関数に渡す必要があります[注意]

[注]
コメントの例で David が正しく指摘しているように、ルールの例外は多重継承であり、基本クラス ポインターがサブクラスと同じアドレスを持たない可能性がありdelete、サブクラス ポインター アドレスの代わりに基本クラス ポインター アドレスを渡します。それでもうまくいきます。

于 2012-09-01T15:30:53.707 に答える
1

はい、そうです、そしてそうです...

于 2012-09-01T15:30:52.037 に答える