3

我有一个函数可以在其中处理和存储大量数据,然后将结果作为类向量返回。这个函数中存储的数据量是巨大的,我想在它完成它的工作后清除函数的存储内存。是否有必要这样做(该功能是否会自动清除内存)还是应该通过某些功能清除内存?

更新:

vector<customers> process(char* const *filename, vector<int> ID)
{
    vector<customers> list_of_customers;
    (perform some actions)
    return list_of_customers;
}
4

3 回答 3

6

函数内本地定义的变量将在函数作用域结束时自动释放。还将调用任何对象的析构函数,这应该释放这些对象分配的任何内存(如果对象编码正确)。这种对象的一个​​例子是std::vector.

你自己分配的任何东西都new必须有一个对应delete的释放存储。尽量避免进行自己的分配并改用RAII,即容器或智能指针。

于 2013-09-24T16:14:32.577 回答
3

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


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

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

因此,当您将std::vector<int>对象传递给函数时,会创建此向量的副本。同样filename以 of 的形式传递char* const*似乎比必要的更复杂。在这种情况下,更合理的原型是:

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,也不会创建任何副本。

看看:什么是复制省略和返回值优化?

于 2013-09-24T16:27:58.803 回答
2

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

例如,如果您使用的是标准容器,例如std::vector<Object> v;对象v将被自动处置。

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

于 2013-09-24T16:13:48.303 回答