在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<int>
的情况下,您无需使用clear()
或swap
来释放内存,因为此处std::vector<int>
的元素(int
s)由@987654326 自动分配和释放@ 方法和析构函数。数据将在作用域(函数或程序)结束时释放。
因此,对您的问题的回答是,您无需致电clear
或swap
。
【讨论】:
我知道,但是从std::vector<int>
用户的角度来看,我们可以说他们是。我这么说是为了避免使事情复杂化:)
不幸的是,这使您的答案听起来错误。这很有误导性。
其实我想知道复杂的事情,我只是简单的问了@Pierre
谢谢,这样更好。
如果是std::vector<strucType> pqrs;
呢?【参考方案2】:
由于上述问题中的vector<int>
对象是具有automatic
存储空间的变量 - 所以当它超出范围时它将被自动销毁。当一个容器对象超出范围时,它的析构函数被调用,这反过来释放了用于存储包含元素的空间,并且在此步骤中,所有包含元素的析构函数也被调用(在用户定义类型的情况下)。所以,如果我们只是计划了int
元素,不需要做任何额外的事情。但是如果 T*
其中T
是某个用户定义的类型,则如果包含类型,我们就会发生内存泄漏,因为在这种情况下,不会为指向的对象显式调用析构函数。
【讨论】:
@juanchopanza 我编辑了我的答案。我的意思是矢量对象不包含任何指针,但是以错误的方式编写它。我希望编辑后,我的答案至少不包含任何错误信息【参考方案3】:您关于内存泄漏的短语使问题的整个含义不清楚。当向量超出范围时,内存被释放。应该没有内存泄漏。
在大型项目中,通常需要一个向量在其超出范围之前释放其分配。不这样做不是内存泄漏,但可能是一个问题。为此,.clear()
毫无用处。您建议的swap
方法(没有.clear
)有效。如果没有swap
,我不知道怎么做。
【讨论】:
如果是std::vector<strucType> pqrs;
呢?
vector
的析构函数调用它持有的对象的析构函数,因此它们可能拥有的内存不会泄漏。 swap
技巧的唯一好处是向量的分配可以在其范围结束之前释放。如果向量超出范围,它会处理所有必需的销毁和内存释放。以上是关于在c ++中删除和释放向量内存的正确方法(防止不同的内存相关错误)的主要内容,如果未能解决你的问题,请参考以下文章
移除对象时内存未释放 - 不清楚在 ARC 中释放的正确方法