是否自动调用析构函数

时间:2012-02-28 18:26:58

标签: c++ destructor

我的问题很简单,但我无法在任何地方找到问题。

如果我有类似这样的课程

class A {
    vector<int> data;
}

A的实例被销毁时,data也会被正确销毁,或者我应该为A编写一个调用data析构函数的析构函数?基本上我担心当A的实例被破坏时是否不会释放向量的动态内存。我怀疑答案是data被正确释放了,但我不想发现自己错了。

此外,如果A是一个结构,当data的本地实例超出范围时,A的析构函数会被调用吗?

3 个答案:

答案 0 :(得分:14)

是的,data将被自动销毁,您无需做任何事情来实现它。 vector将处理由其分配的动态内存的清理。当A的实例被销毁时,将自动调用向量的析构函数。

无论Aclass还是struct,行为都没有区别。

答案 1 :(得分:3)

不需要,数据成员的析构函数总是被调用。

显式析构函数是有用的手动内存管理

struct a{
    int* ip;
    a() 
    : ip(new int(5)) 
    { }

    ~a() { delete ip; }
};

那就是说,一般来说你应该使用RAII容器(比如智能指针),所以我个人很少在那里写dtors。

例外情况是将基类dtor声明为虚拟。

struct base {
     virtual ~base() {}
};
struct child : public base {
    //base and child destructor automatically called 
}

答案 2 :(得分:1)

如果您自己没有定义默认析构函数,则编译器会自动创建它。通常,您不需要创建自己的析构函数,除非您有指针数据 - 成员“拥有”他们指向的内存,和/或您正在设计您的类以便由其他类派生,此时您需要至少声明一个空的virtual析构函数。

在所有情况下,使用您自己的析构函数以及默认的编译器创建的析构函数,非静态数据成员的所有析构函数以及当前类的任何基类都在析构函数和析构函数本身返回之前。