我的问题很简单,但我无法在任何地方找到问题。
如果我有类似这样的课程
class A {
vector<int> data;
}
当A
的实例被销毁时,data
也会被正确销毁,或者我应该为A
编写一个调用data
析构函数的析构函数?基本上我担心当A
的实例被破坏时是否不会释放向量的动态内存。我怀疑答案是data
被正确释放了,但我不想发现自己错了。
此外,如果A
是一个结构,当data
的本地实例超出范围时,A
的析构函数会被调用吗?
答案 0 :(得分:14)
是的,data
将被自动销毁,您无需做任何事情来实现它。 vector
将处理由其分配的动态内存的清理。当A
的实例被销毁时,将自动调用向量的析构函数。
无论A
是class
还是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
析构函数。
在所有情况下,使用您自己的析构函数以及默认的编译器创建的析构函数,非静态数据成员的所有析构函数以及当前类的任何基类都在析构函数和析构函数本身返回之前。