C++中向量的解定位
Deallocation of a vector in C++
可能的重复:
删除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
的析构函数在为delete
d时调用(§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次。
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 干净地破坏动态定位对象的向量
- 通过在排序向量上使用二叉搜索来定位未排序向量中的元素
- 使用 std::find 在向量中定位随机生成的数字
- C++中向量的解定位
- TC++PL书中练习中向量ctor的定位错误
- 在push_back到静态向量之后C++取消定位
- 嵌套c++向量的重新定位
- 当向量需要更多内存并重新定位内存时,指针会发生什么