是否自动调用析构函数

Does the destructor get called automatically

本文关键字:析构函数 调用 是否      更新时间:2023-10-16

我的问题很简单,但我在任何地方都找不到这个问题。

如果我有这样的类

class A {
    vector<int> data;
}

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

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

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

无论CCD_ 13是CCD_ 14还是CCD_。

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

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

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

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

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

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

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

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