可能重复:
删除包含C++ STL中的向量的动态分配对象
我有这样的结构
struct foo {
vector<int> myvector;
};
Run Code Online (Sandbox Code Playgroud)
现在,我创建一个指向foo的指针,调整大小并将一些元素插入到向量中.
foo *myfoo = new foo;
myfoo->myvector.resize(100);
myfoo->myvector.push_back(0);
myfoo->myvector.push_back(1);
... // and so on
Run Code Online (Sandbox Code Playgroud)
现在,在myfoo超出范围之前,我将不得不释放分配给它的内存
delete myfoo;
Run Code Online (Sandbox Code Playgroud)
我的问题是,这是否会照顾我的myvector?我有这个特殊的查询,因为现在myvector被调整大小,STL库可能会在堆中分配容器.所以,当我释放myfoo时,我不希望分配给myvector的内存泄漏.
是的,删除myfoo也将销毁其所有成员,其中包括std::vector.重要的是要注意,如果你有指针foo,只有指针会被销毁,而不是它们指向的对象(除非你定义了一个为你完成这项工作的析构函数 - 你应该这样做!).
标准规定,在执行析构函数之后,任何非静态数据成员也会被销毁(§12.4/ 8):
在执行析构函数的主体并销毁在主体内分配的任何自动对象之后,类
X的析构函数调用析构函数X的直接非变量非静态数据成员,X直接基类的析构函数,如果X是最派生类的类型(12.6.2),它的析构函数调用析构函数X的虚拟基类.
该类foo有一个默认的析构函数,因为没有定义用户声明的析构函数(§12.4/ 4):
如果一个类没有用户声明的析构函数,则析构函数被隐式声明为默认值(8.4).
析构函数在d(第5.3.5/6节)myfoo时被调用delete:
如果delete-expression的操作数的值不是空指针值,则delete-expression将调用该对象的析构函数(如果有)或要删除的数组的元素.
甲delete表达式是如下形式的表达:
::optdeletecast-expression