2

可能重复:
在 C++ STL 中删除包含向量的动态分配对象

我有这样的结构

struct foo {
  vector<int> myvector;
};

现在,我创建一个指向 foo 的指针,调整大小并将一些元素插入到向量中。

foo *myfoo = new foo;
myfoo->myvector.resize(100);
myfoo->myvector.push_back(0);
myfoo->myvector.push_back(1);
... // and so on

现在,在 myfoo 超出范围之前,我必须释放分配给它的内存

delete myfoo;

我的问题是这是否也会释放 myvector?我有这个特定的查询,因为现在 myvector 已调整大小,STL 库可能会在堆中分配容器。因此,当我释放 myfoo 时,我不希望分配给 myvector 的内存泄漏。

4

4 回答 4

7

是的,删除myfoo也会破坏它的所有成员,包括std::vector. 重要的是要注意,如果你在里面有指针foo,只有指针会被销毁,而不是它们指向的对象(当然,除非你定义了一个为你完成这项工作的析构函数——你应该这样做!)。

标准规定,在执行析构函数后,任何非静态数据成员也将被销毁(第 12.4/8 节):

在执行析构函数的主体并销毁主体内分配的任何自动对象后,类X的析构函数调用X的直接非变体非静态数据成员的析构函数、X直接基类的析构函数,如果X是最派生类 (12.6.2) 的类型,它的析构函数调用X的虚拟基类的析构函数。

该类foo有一个默认的析构函数,因为没有定义用户声明的析构函数(§12.4/4):

如果一个类没有用户声明的析构函数,则析构函数被隐式声明为默认(8.4)。

的析构函数myfoo在它为deleted 时被调用(§5.3.5/6):

如果delete-expression的操作数的值不是空指针值,则delete-expression将为要删除的对象或数组的元素调用析构函数(如果有)。

删除表达式是以下形式的表达式:

::选择 delete 强制转换表达式

于 2012-12-07T22:11:36.067 回答
4

调用delete foo将在 的所有成员上释放和调用析构函数(如果适用)foo,所以是的。如果它不以这种方式工作,该语言将难以使用。

于 2012-12-07T22:13:06.487 回答
3

struct foo 只是保存向量的容器。无论如何,向量的项目都是单独分配的(通常在堆上)。

向量的析构函数删除堆上的实际向量,当对象被删除时,向量被销毁。

于 2012-12-07T22:13:25.457 回答
2

这是回答您的问题的代码示例。

#include <iostream>

struct bar {
    ~bar() {std::cout << "deleted bar" << std::endl;}
};

struct foo {
  bar b[10];  
};

int main() {
    foo* f = new foo();
    delete f;
}

程序将打印“deleted bar” 10 次。

于 2012-12-07T22:50:25.450 回答