在函数中返回向量后清除内存

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 向量不会自动返回所有指向的事物*。【参考方案2】:

“我想在函数完成它的工作后清除它的存储内存” ~> 只要你使用具有自动存储持续时间的对象,一切都会得到照顾(在内存管理)。当您开始使用动态分配时,内存管理问题就开始了,这使您成为负责清理的人。基本上:对于你调用的每个new,应该调用一个delete,对于你调用的每个new[],应该调用一个delete[]。因此,如果可以,请尽可能避免动态分配内容。


现在请注意,您的函数按值接受第二个参数:

vector<customers> process(char* const *filename, vector<int> ID)

因此,当您将std::vector&lt;int&gt; 对象传递给您的函数时,会创建此向量的副本。同样以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】:

如果函数内的对象有合适的析构函数,或者它们没有被mallocnew 在堆中分配。它们将被自动处理。否则你应该delete他们。

例如,如果您使用std::vector&lt;Object&gt; v; 等标准容器,则会自动释放对象v

在使用智能指针的情况下,可以new 一个对象并期望它被自动释放。

【讨论】:

以上是关于在函数中返回向量后清除内存的主要内容,如果未能解决你的问题,请参考以下文章

C++ 函数返回一个向量/字符串,但不是一个数组

堆栈内存 /STACK

堆栈内存/堆栈

R语言使用sort.list函数对向量数据进行排序(默认升序排序)返回排序后的对应索引值

返回一个已知大小的向量而不需要额外的包装器?

指针函数不可以返回局部变量地址解决