我有一个在类中声明的结构的向量。我的问题是我是否必须在类析构函数中显式释放向量分配的内存,或者在我销毁实例时自动完成。在中,我是否必须在类析构函数中包含代码以释放向量的内存。
答案 0 :(得分:2)
如果你没有析构函数且vector是类成员,那么它将由编译器生成的默认析构函数隐含。
默认的析构函数调用基类的析构函数 派生类的成员。
反向调用基类和成员的析构函数 完成构造函数的顺序:
在析构函数之前调用类对象的析构函数 成员和基地被称为。非静态成员的析构函数是 在调用基类的析构函数之前调用。破坏者 在虚拟基础的析构函数之前调用非虚基类 课程被称为。
关于你自己提供的析构函数:
一个类的析构函数(无论你是否明确定义一个) 自动调用成员对象的析构函数。他们是 以相反的顺序销毁它们出现在声明中 上课。
答案 1 :(得分:2)
如果您使用new
自行分配结构,则需要在完成它们时使用delete
解除分配。 std::vector
不会为你做那件事。
书中Effective C++(强烈推荐)中的第13项说使用对象来管理资源。这有助于您避免出现诸如不必担心资源解除分配代码被调用等问题,例如,抛出异常。如果您使用的是C ++ 11,则可以查看shared_ptr或只创建自己的资源管理类。
更新:正如jogojapan指出的那样,std :: auto_ptr不适合STL容器。
答案 2 :(得分:1)
无论您是否拥有自己的析构函数: 你的类的每个成员都会调用它的析构函数(记住:如果成员是一个指针并且你手动分配了内存,你需要在析构函数体中释放已分配的内存,因为自动销毁会破坏指针但不会释放它指向的内存)。
C ++标准说,在析构函数体之后,所有非变量非静态数据成员都将调用它们的析构函数。