2011-05-13 79 views

回答

6

如果你删除一个对象,该对象的析构函数将被调用,所以你需要在析构函数中做一个删除操作。所以请记住,类在堆上分配的所有内容都必须在析构函数中释放。如果它被分配在堆栈上自动发生这种情况

struct A 
{ 
    A() { std::cout << "A()" << std::endl; ptr = new char[10]; } 
    ~A() { std::cout << "~A()" << std::endl; delete []ptr; } 
    char *ptr; 
}; 

但要小心,如果你使用的是继承,如果从基类A继承,你需要做的基础析构函数虚拟的,或者在析构函数A将不会被调用,您将有内存泄漏。

struct Base 
{ 
    virtual ~Base() {} 
}; 

struct A : public Base 
{ 
    A() { std::cout << "A()" << std::endl; ptr = new char[10]; } 
    ~A() { std::cout << "~A()" << std::endl; delete []ptr; } 
    char *ptr; 
}; 
3

他们会卡在内存中。因此,当您在对象内进行动态内存分配时,您需要定义析构函数。当父对象即将被删除时,D'tor被调用,并且你应该明确地释放所有的子分配内存。请致电Wikipedia

+3

而当你定义一个析构函数时,你应该定义一个复制构造函数和一个复制赋值运算符。 [见这里](http://stackoverflow.com/questions/4172722/)。 – 2011-05-13 09:19:58

+1

@Space:错误...三规则不包括* constructor *:[见维基](http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)) – Nawaz 2011-05-13 09:21:09

+0

@Nawaz:谢谢。这是一个错字。现在好多了? – 2011-05-13 09:23:44

1

是的,你会在类的析构函数中清理内存。

1

显式指针必须是delete(由您或某个库包装器)。例如;

struct A { 
    char *p; // assume p = new char[] somewhere; 
}; 

A* pA = new A; 
delete pA; // <-- this doesn't clean up char* p 
1

如果您在Deconstructer中专门告诉它,对象只会清除指针。

1

如果一个类被正确写入,删除该类的一个实例应该释放该类所分配的所有资源。

如果类存储指向内存的指针而不是分配,除非文档另有规定,否则通常不会删除这些指针。