C++中向量的解定位

Deallocation of a vector in C++

本文关键字:定位 向量 C++      更新时间:2023-10-16

可能的重复:
删除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的内存泄漏。

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

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

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

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

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

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

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

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

::optdelete投射表达式

调用delete foo将解除分配并调用foo的所有成员上的析构函数(如果适用),所以是的。如果它不以这种方式工作,语言将更加难以使用。

结构体foo只包含向量的容器。无论如何,向量的项是单独分配的(通常在堆上)。

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

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

#include <iostream>
struct bar {
~bar() {std::cout << "deleted bar" << std::endl;}
};
struct foo {
bar b[10];  
};
int main() {
foo* f = new foo();
delete f;
}

该程序将打印"已删除的条形图"10次。