在C ++中重新分配向量

时间:2012-12-07 22:10:06

标签: c++ stl vector

  

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

4 个答案:

答案 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 是以下形式的表达式:

  

:: opt delete 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次。