valgrindwith を使用して C++ で次のコードを確認しました--leak-check=fullが、メモリ リークはないと表示されます。何故ですか?
char *p = new char[256];
delete p;
new[]delete[]私の知る限り一致するはずです。
valgrindwith を使用して 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 []。