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”将在 main 中的 foo() 之后被删除,或者仍然存在于堆中?

4

3 回答 3

5

是的,它将被删除,因为您需要delete[]用于数组。你也应该记住三法则

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

应该

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

在您当前的代码中,当 main 退出时,它将调用析构函数来释放内存,并且不会存在于堆中。

于 2013-04-21T21:18:06.893 回答
2

当一个对象被破坏时,编译器会自动破坏该类的所有非指针数据成员。因此,当您的B b变量超出范围时,编译器会自动破坏它,进而破坏A a数据成员,因为它不是指针,它调用~A()释放数组。

于 2013-04-21T21:25:29.093 回答