在c ++中删除和释放向量内存的正确方法(防止不同的内存相关错误)

Posted

技术标签:

【中文标题】在c ++中删除和释放向量内存的正确方法(防止不同的内存相关错误)【英文标题】:Proper way to delete and free up memory of a vector (prevent different memory related errors) in c++ 【发布时间】:2015-12-30 10:00:46 【问题描述】:

创建一个向量:

std::vector<int> pqrs;

以适当的方式删除以释放函数内部的所有内存(防止内存泄漏和其他内存相关问题):

pqrs.clear();
std::vector<int>().swap(pqrs);

我的问题是:需要清除和交换(比如调用析构函数)?或交换足以满足所有目的。

【问题讨论】:

C++ vector::clear的可能重复 你也不需要。超出范围时,向量会清除。 你的意思是清除函数内部的内存,还是当它超出范围时?无论如何,后者是自动完成的。 当然在函数里面。 “无论如何,后者是自动完成的。”-是的,我知道 【参考方案1】:

std::vector&lt;int&gt; 的情况下,您无需使用clear()swap 来释放内存,因为此处std::vector&lt;int&gt; 的元素(ints)由@987654326 自动分配和释放@ 方法和析构函数。数据将在作用域(函数或程序)结束时释放。

因此,对您的问题的回答是,您无需致电clearswap

【讨论】:

我知道,但是从std::vector&lt;int&gt; 用户的角度来看,我们可以说他们是。我这么说是为了避免使事情复杂化:) 不幸的是,这使您的答案听起来错误。这很有误导性。 其实我想知道复杂的事情,我只是简单的问了@Pierre 谢谢,这样更好。 如果是std::vector&lt;strucType&gt; pqrs;呢?【参考方案2】:

由于上述问题中的vector&lt;int&gt; 对象是具有automatic 存储空间的变量 - 所以当它超出范围时它将被自动销毁。当一个容器对象超出范围时,它的析构函数被调用,这反过来释放了用于存储包含元素的空间,并且在此步骤中,所有包含元素的析构函数也被调用(在用户定义类型的情况下)。所以,如果我们只是计划了int 元素,不需要做任何额外的事情。但是如果 T* 其中T 是某个用户定义的类型,则如果包含类型,我们就会发生内存泄漏,因为在这种情况下,不会为指向的对象显式调用析构函数。

【讨论】:

@juanchopanza 我编辑了我的答案。我的意思是矢量对象不包含任何指针,但是以错误的方式编写它。我希望编辑后,我的答案至少不包含任何错误信息【参考方案3】:

您关于内存泄漏的短语使问题的整个含义不清楚。当向量超出范围时,内存被释放。应该没有内存泄漏。

在大型项目中,通常需要一个向量在其超出范围之前释放其分配。不这样做不是内存泄漏,但可能是一个问题。为此,.clear() 毫无用处。您建议的swap 方法(没有.clear)有效。如果没有swap,我不知道怎么做。

【讨论】:

如果是std::vector&lt;strucType&gt; pqrs;呢? vector 的析构函数调用它持有的对象的析构函数,因此它们可能拥有的内存不会泄漏。 swap 技巧的唯一好处是向量的分配可以在其范围结束之前释放。如果向量超出范围,它会处理所有必需的销毁和内存释放。

以上是关于在c ++中删除和释放向量内存的正确方法(防止不同的内存相关错误)的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中释放内存的正确方法是啥

new和声明的不同

移除对象时内存未释放 - 不清楚在 ARC 中释放的正确方法

防止 WPF 中的内存泄漏

有没有更好的替代 std::remove_if 从向量中删除元素的方法?

如何在c ++中清除已删除对象的内存?