次のコード スニップがあります。
int nWidth = 10;
int *pData = new int[nWidth];
//I do something here
//then I free memory by:
delete pData;
このコードのスニップはメモリ リークを引き起こしますか? 使用する必要がありますか:
delete[] pData;
次のコード スニップがあります。
int nWidth = 10;
int *pData = new int[nWidth];
//I do something here
//then I free memory by:
delete pData;
このコードのスニップはメモリ リークを引き起こしますか? 使用する必要がありますか:
delete[] pData;
使用しない場合delete[] pData
の動作は未定義です。メモリ リークが発生する可能性があり、プログラムがクラッシュする可能性があり、最も重要な顧客のためにプログラムのデモを行うまで問題なく動作する可能性があります。
このコードのスニップはメモリ リークを引き起こしますか?
いいえ、それは未定義の動作をします。これはさらに悪いことです。
使用する必要がありますか:
delete[] pData;
はい、で割り当てられたすべてのメモリは、new[]
で解放する必要がありますdelete[]
。ただし、早期復帰または例外によってプログラムが削除式に到達できない場合は、依然としてメモリ リークが発生します。
特別なことをしていない限り、メモリを明示的に管理する必要はほとんどありません。この場合、標準ライブラリは便利な動的配列型を提供します。
#include <vector>
std::vector<int> data(nWidth);
// Do something here.
// Memory is freed automatically when data goes out of scope.
はい、使用する必要があります:
delete[] pData;
動的割り当てに関して次の点に注意してください。
delete[]
を使用してメモリを割り当てた場合は、使用する必要がありますnew[]
delete
を使用してメモリを割り当てた場合は、使用する必要がありますnew
free()
を使用してメモリを割り当てた場合は、使用する必要がありますmalloc()
[注]
コメントの例で David が正しく指摘しているように、ルールの例外は多重継承であり、基本クラス ポインターがサブクラスと同じアドレスを持たない可能性がありdelete
、サブクラス ポインター アドレスの代わりに基本クラス ポインター アドレスを渡します。それでもうまくいきます。
はい、そうです、そしてそうです...