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

Posted

技术标签:

【中文标题】如果没有堆内存,如何释放 std::vector【英文标题】:How to release std::vector if there is no heap memory 【发布时间】:2011-10-28 04:27:05 【问题描述】:

我有一个这样的类成员变量:

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的析构函数没有调用它的元素的析构函数。

你能确认我的电话吗?

【问题讨论】:

【参考方案1】:

您无需为m_stacksclass 数据成员)做任何事情。调用class 析构函数时将自动释放获取的内存。这就是使用std::vector 的目的。

【讨论】:

【参考方案2】:

向量的析构函数会做两件事:它会破坏向量的每个元素,然后它会释放用于向量本身的内存。这是自动的。

在您的情况下,您有两个深度嵌套的向量,但这没关系。当顶层向量被销毁时,它会为它包含的每个向量调用析构函数,所有这些向量都会正确地清理自己。

【讨论】:

【参考方案3】:

std::vector 析构函数在其分配的内存上调用 delete,从而调用该类型(在本例中为 std::vector&lt;int&gt; 的)析构函数。

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

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

【讨论】:

以上是关于如果没有堆内存,如何释放 std::vector的主要内容,如果未能解决你的问题,请参考以下文章

C ++如何在堆栈上动态分配内存?

JNA/ByteBuffer 没有被释放并导致 C 堆内存不足

std::vector - 如何释放向量中 char* 元素的内存?

如果/啥时候释放的堆内存被回收?

JavaScript基础知识六(内存释放作用域销毁)

C语言堆内存管理上出现的问题,内存泄露,野指针使用,非法释放指针