释放在类中分配的向量?

时间:2013-06-24 01:04:14

标签: c++ memory-management vector

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

3 个答案:

答案 0 :(得分:2)

如果你没有析构函数且vector是类成员,那么它将由编译器生成的默认析构函数隐含。

  

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

     

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

     

在析构函数之前调用类对象的析构函数   成员和基地被称为。非静态成员的析构函数是   在调用基类的析构函数之前调用。破坏者   在虚拟基础的析构函数之前调用非虚基类   课程被称为。

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

  

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

There are still the differences...

答案 1 :(得分:2)

如果您使用new自行分配结构,则需要在完成它们时使用delete解除分配。 std::vector不会为你做那件事。

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

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

答案 2 :(得分:1)

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

C ++标准说,在析构函数体之后,所有非变量非静态数据成员都将调用它们的析构函数。