如果没有堆内存,如何释放std :: vector

时间:2011-10-28 04:27:06

标签: c++ memory-management vector

我有一个类成员变量:

vector<vector<int> >  m_stacks;

当我填充它时,我喜欢这样:

vector<int> v;
v.push_back(1);
v.push_back(2);
m_stacks.push_back(v);
vector<int> v2;
v2.push_back(1);
v2.push_back(2);
m_stacks.push_back(v2);

现在我想知道我应该在类析构函数中做些什么来释放m_stacks。我没有为它分配任何堆内存,所以如果我真的需要做任何事情我就会挣扎。最后我提出来了 -

vector<vector<int> >::iterator itr = m_stacks.begin();
for ( ; itr != m_stacks.end(); ++itr) {
  itr->clear();
}

我认为这是我最需要做的事情,我不需要致电m_stacks.clear()。原因是vector的析构函数可以自动释放内存。但是我仍然需要上面的代码,原因是vector的析构函数不会调用它的元素的析构函数。

你能确认一下我的电话吗?

3 个答案:

答案 0 :(得分:14)

您无需为m_stacksclass数据成员)执行任何操作。当调用class析构函数时,将自动释放获取的内存。这是std::vector的使用目的。

答案 1 :(得分:8)

向量的析构函数将执行两项操作:它将销毁向量的每个元素,然后它将释放用于向量本身的内存。这是自动的。

在你的情况下你有两个嵌套的矢量,但没关系。当顶层向量被破坏时,它将为它包含的每个向量调用析构函数,并且所有这些向量都将正确地清理它们。

答案 2 :(得分:6)

std::vector析构函数在它分配的内存上调用delete,从而调用这些类型(在本例中为std::vector<int>的)析构函数。

这些数据结构都依赖于SBRM(范围绑定资源管理)或RAII(资源获取是初始化)原则,因为它们分配的所有内存一旦超出范围(例如范围)就会被解除分配类)。

除非它拥有指向内存的类型,否则您不必担心从std::vector释放内存;但不会固有地释放它(例如指针!)。