0

例:

class A
{
   char * data;
   ...
   A(){data = new char[50];}
   ~A(){delete [] data;}
};

class B
{
   A a;

   B();
   // default destructor
}

void foo()
{
   B b;
}

int main()
{
   foo();

   // "A.data" still in the heap or no?
}

このプログラムは正しく、「A.data」はメインの foo() の後に削除されますか、それともヒープにまだ存在しますか?

4

3 に答える 3

5

delete[]はい、配列に使用する必要があるため、削除されます。また、3つのルールを覚えておく必要があります

于 2013-04-21T21:17:46.347 に答える
3
~A(){delete data;}

する必要があります

~A()
{
    delete[] data;
 }
 //remove the dynamic array

現在のコードでは、メインが終了すると、デストラクタを呼び出してメモリを解放し、ヒープに存在しません。

于 2013-04-21T21:18:06.893 に答える
2

オブジェクトが破棄されると、コンパイラはクラスの非ポインター データ メンバーをすべて自動的に破棄します。したがって、B b変数がスコープ外になると、コンパイラは自動的にそれを破棄します。これは、配列を解放するためA aに呼び出すポインターではないため、データ メンバーを破棄します。~A()

于 2013-04-21T21:25:29.093 に答える