valgrind
with を使用して C++ で次のコードを確認しました--leak-check=full
が、メモリ リークはないと表示されます。何故ですか?
char *p = new char[256];
delete p;
new[]
delete[]
私の知る限り一致するはずです。
valgrind
with を使用して C++ で次のコードを確認しました--leak-check=full
が、メモリ リークはないと表示されます。何故ですか?
char *p = new char[256];
delete p;
new[]
delete[]
私の知る限り一致するはずです。
delete
が charやint などの基本データ型を指してdelete[]
いる場合にのみ等しくなります。p
p
オブジェクト配列を指している場合、結果は異なります。以下のコードを試してください。
class T {
public:
T() { cout << "constructor" << endl; }
~T() { cout << "destructor" << endl; }
};
int main()
{
const int NUM = 3;
T* p1 = new T[NUM];
cout << p1 << endl;
// delete[] p1;
delete p1;
T* p2 = new T[NUM];
cout << p2 << endl;
delete[] p2;
}
delete[]
配列内の T のすべてのデストラクタを使用すると、呼び出されます。delete
のみを使用p[0]
すると、のデストラクタが呼び出されます。
delete
との違いはdelete []
、オブジェクトを削除するためのデストラクタを呼び出すコードがコンパイラによって追加されることです。次のように言います。
class A
{
int a;
public:
...
~A() { cout<<"D'tor"; }
};
a=new A[23];
delete [] a;
これdelete [] a;
は、次のように変換されます。
for (int i=0; i<23; i++)
{
a[i].A::~A();
}
std::delete a;
したがって、あなたの場合、組み込みのデータ型であるため、呼び出すデストラクタはありません。したがって、次のように変換されます。
std::delete a;
どのインターンが を呼び出してfree()
メモリの割り当てを解除します。これが、漏れが発生しない理由です。free()
割り当てられたメモリは、g++を使用して完全に割り当て解除されているためです。
ただし、ベスト プラクティスは、使用するdelete []
場合はバージョンを使用する必要があることですnew []
。