可能重复:
deleting dynamically allocated object that contains vector in 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的内存泄漏。
答案 0 :(得分:7)
是的,删除myfoo
也会销毁其所有成员,其中包括std::vector
。重要的是要注意,如果你在foo
内有指针,只会破坏指针,而不是它们指向的对象(除非你定义了一个为你完成这项工作的析构函数 - 你应该这样做!)。
标准规定,在执行析构函数之后,任何非静态数据成员也会被销毁(§12.4/ 8):
执行析构函数体并销毁正文中分配的任何自动对象后,类
X
的析构函数调用X
的直接非变量非静态数据成员的析构函数,X
直接基类的析构函数,如果X
是派生类最多的类(12.6.2),它的析构函数调用X
虚拟基的析构函数类。
类foo
有一个默认的析构函数,因为没有定义用户声明的析构函数(§12.4/ 4):
如果一个类没有用户声明的析构函数,则析构函数被隐式声明为默认值(8.4)。
在myfoo
d(§5.3.5/ 6)时调用delete
的析构函数:
如果 delete-expression 的操作数值不是空指针值, delete-expression 将调用该对象的析构函数(如果有)或者要删除的数组元素。
delete-expression 是以下形式的表达式:
::
optdelete
cast-expression
答案 1 :(得分:4)
调用delete foo
将取消分配并调用foo
所有成员的析构函数(如果适用),是的。如果它不能以这种方式工作,那么语言就会难以使用。
答案 2 :(得分:3)
struct foo只保存向量的容器。无论如何,向量的项目都是单独分配的(通常在堆上)。
向量的析构函数删除堆上的实际向量,并在删除对象时销毁向量。
答案 3 :(得分: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;
}
程序将打印“删除栏”10次。