0

我有一个在类中声明的结构向量。我的问题是我必须在类析构函数中显式释放向量分配的内存,还是在销毁实例时自动完成。如,我是否必须在类析构函数中包含代码以释放向量的内存。

4

3 回答 3

2

如果您没有析构函数并且向量是类成员,它将由编译器生成的默认析构函数隐含。

默认析构函数调用基类的析构函数和派生类的成员。

基类和成员的析构函数按其构造函数完成的相反顺序调用:

在调用成员和基的析构函数之前调用类对象的析构函数。在调用基类的析构函数之前调用非静态成员的析构函数。非虚拟基类的析构函数在调用虚拟基类的析构函数之前被调用。

关于您自己提供的析构函数:

类的析构函数(无论您是否明确定义)会自动调用成员对象的析构函数。它们以它们在类声明中出现的相反顺序被销毁。

还是有区别的...

于 2013-06-24T01:10:34.920 回答
2

如果您自己使用分配结构,new那么您需要在使用delete完它们后释放它们。std::vector不会为你这样做。

《 Effective C++ 》(强烈推荐)一书中的第 13 项说使用对象来管理资源。这可以帮助您避免诸如必须担心您的资源取消分配代码不会被调用等问题,例如,抛出异常。如果您使用的是 C++11,您可以查看shared_ptr或创建自己的资源管理类。

更新:正如 jogojapan 指出的,std::auto_ptr 不适合 STL 容器。

于 2013-06-24T01:51:56.173 回答
1

无论您是否有自己的析构函数:类的每个成员都会调用其析构函数(请记住:如果成员是指针并且您手动分配了内存,则需要释放析构函数体中分配的内存,因为自动销毁将销毁指针但不会释放它指向的内存)。

C++ 标准规定,在析构函数主体之后,所有非变体非静态数据成员都将调用其析构函数。

于 2013-06-24T02:20:56.333 回答