在函数中返回向量后清除内存
Posted
技术标签:
【中文标题】在函数中返回向量后清除内存【英文标题】:Clear the memory after returning a vector in a function 【发布时间】:2013-09-24 16:06:31 【问题描述】:我有一个函数可以处理和存储大量数据,然后将结果作为类向量返回。这个函数中存储的数据量是巨大的,我想在它完成它的工作后清除函数的存储内存。是否有必要这样做(该功能是否会自动清除内存)还是应该通过某些功能清除内存?
更新:
vector<customers> process(char* const *filename, vector<int> ID)
vector<customers> list_of_customers;
(perform some actions)
return list_of_customers;
【问题讨论】:
您可以粘贴您正在谈论的功能的版本吗? 这取决于你如何分配内存和返回向量。请提供代码示例。 @POD,有 (N)RVO 和移动语义。 如果您可以使用 C++11 功能,请尝试移动语义以避免在函数返回时创建另一个向量副本。 【参考方案1】:在函数内本地定义的变量将在函数作用域结束时自动释放。还将调用任何对象的析构函数,这应该释放这些对象分配的任何内存(如果对象编码正确)。这种对象的一个例子是std::vector
。
您使用new
分配给自己的任何东西都必须有一个对应的delete
才能释放存储空间。尽量避免自己分配,而是使用RAII,即容器或智能指针。
【讨论】:
这是我想知道的。 但请注意,如果您的向量是 std::vector“我想在函数完成它的工作后清除它的存储内存” ~> 只要你使用具有自动存储持续时间的对象,一切都会得到照顾(在内存管理)。当您开始使用动态分配时,内存管理问题就开始了,这使您成为负责清理的人。基本上:对于你调用的每个new
,应该调用一个delete
,对于你调用的每个new[]
,应该调用一个delete[]
。因此,如果可以,请尽可能避免动态分配内容。
现在请注意,您的函数按值接受第二个参数:
vector<customers> process(char* const *filename, vector<int> ID)
因此,当您将std::vector<int>
对象传递给您的函数时,会创建此向量的副本。同样以char* const*
的形式传递filename
似乎比必要的更复杂。在这种情况下,更合理的原型是:
std::vector<customers> process(const char* filename, const std::vector<int>& ID)
现在在这个函数的主体中:
std::vector<customers> list_of_customers;
...
return list_of_customers;
list_of_customers
是一个具有自动存储期限的对象。在没有优化的情况下,在调用return
时,将创建此向量的副本,并且将正确销毁原始对象。然而,有各种优化技术,如 NRVO,可以处理创建的冗余副本,因此您无需担心。如果您将通过以下方式使用此功能:
std::vector<customers> list_of_customers = process(filename, ID);
复制省略很可能会发生,因此即使没有 NRVO,也不会创建任何副本。
看看:What are copy elision and return value optimization?
【讨论】:
【参考方案3】:如果函数内的对象有合适的析构函数,或者它们没有被malloc
或new
在堆中分配。它们将被自动处理。否则你应该delete
他们。
例如,如果您使用std::vector<Object> v;
等标准容器,则会自动释放对象v
。
在使用智能指针的情况下,可以new
一个对象并期望它被自动释放。
【讨论】:
以上是关于在函数中返回向量后清除内存的主要内容,如果未能解决你的问题,请参考以下文章