29

valgrindwith を使用して C++ で次のコードを確認しました--leak-check=fullが、メモリ リークはないと表示されます。何故ですか?

char *p = new char[256];
delete p;

new[]delete[]私の知る限り一致するはずです。

4

6 に答える 6

12

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]すると、のデストラクタが呼び出されます。

于 2013-09-27T07:20:43.317 に答える
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 []

于 2013-09-27T07:59:58.220 に答える