C++ 析构函数是否自动调用

C++ 析构函数是否自动调用,c++,destructor,C++,Destructor,我的问题很简单,但我在任何地方都找不到这个问题 如果我有这样的课 class A { vector<int> data; } A类{ 矢量数据; } 当A的实例被销毁时,data也会被正确销毁,或者我应该为A编写一个调用data的析构函数的析构函数吗?基本上,我担心的是当A的一个实例被破坏时,vector的动态内存是否会被释放。我怀疑答案是,数据被正确地释放了,但我不想硬着头皮去发现我错了 此外,如果A是一个结构,当A的本地实例超出范围时,data的析构函数会被调用吗?是

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

如果我有这样的课

class A {
    vector<int> data;
}
A类{
矢量数据;
}
A
的实例被销毁时,
data
也会被正确销毁,或者我应该为
A
编写一个调用
data
的析构函数的析构函数吗?基本上,我担心的是当
A
的一个实例被破坏时,vector的动态内存是否会被释放。我怀疑答案是,
数据
被正确地释放了,但我不想硬着头皮去发现我错了


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

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


无论
A
class
还是
struct
,行为都没有区别。无需如此,数据成员的析构函数总是被调用

显式析构函数对于手动内存管理非常有用

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 
}

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


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

+1,“vector将处理由其分配的动态内存的清理“,而不是它。如果您将动态分配的对象存储在向量中,您有责任相应地
删除它们。@netcoder发现您的评论有点误导。您可以在向量中存储指向动态分配对象的指针,但我认为您不能存储在向量中动态分配的“对象”本身。若您声明一个向量,其中ClassA是类名,那个么该向量将负责销毁它所持有的ClassA对象。当然,如果您的ClassA对象包含指向其他对象的指针,则ClassA有责任删除它们,而不是vector的责任,但这是另一回事。在声明
ClassA
之后,您缺少一个分号(这不是真正的声明,因为它缺少…哦,好吧).+1,用于遵守良好的RAII原则。当人们编写C++时,Stroustrup、萨特、迈尔斯和其他现代C++思想家打算编写它的方式,手工编写析构函数的需要应该越来越少。