2013-04-21 68 views
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()之后去除,或将在堆中还存在吗?

+0

对不起,修正。问题依然存在。 – 2013-04-21 21:19:22

回答

5

是的,它会被删除,通过你需要使用delete[]阵列。你还应该记住Rule of three

+0

或者使用'std :: vector'跳舞到[Rule of Zero](http://isocpp.org/blog/2012/11/rule-of-zero) – 2013-04-21 21:51:52

3
~A(){delete data;} 

应该

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

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

2

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

+0

非常感谢! – 2013-04-21 21:40:19