在函数中返回向量后清除内存
Clear the memory after returning a vector in a function
我有一个函数,它在其中处理和存储大量数据,然后将结果作为类的向量返回。此函数中存储的数据量非常巨大,我想在函数完成工作后清除其存储内存。是否有必要这样做(函数是否自动清除内存(还是我应该通过某个函数清除内存?
更新:
vector<customers> process(char* const *filename, vector<int> ID)
{
vector<customers> list_of_customers;
(perform some actions)
return list_of_customers;
}
函数中本地定义的变量将在函数作用域结束时自动释放。还将调用任何对象的析构函数,这应该释放这些对象分配的任何内存(如果对象编码正确(。此类对象的一个例子是 std::vector
。
您为自己分配的任何内容都必须new
具有相应的delete
才能释放存储空间。尽量避免自己分配,而是使用 RAII,即容器或智能指针。
"我想在函数完成工作后清除它的存储内存"> ~> 只要您使用具有自动存储持续时间的对象,一切都会得到照顾(在内存管理方面(。当您开始使用动态分配时,内存管理问题就开始了,这使您成为负责清理的人。基本上:对于您调用的每个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,也不会创建任何副本。
看一看:什么是复制省略和返回值优化?
如果函数中的对象具有合适的析构函数,或者它们未按 malloc
或 new
在堆中分配。它们将被自动处置。否则,您应该delete
它们。
例如,如果您使用的是标准容器(如 std::vector<Object> v;
(,则对象v
将自动释放。
在使用智能指针的情况下,可以new
对象并期望它被自动释放。
- 如何使用内存集清除字符数组
- 清除在 main() 中分配的堆栈内存?
- 清除按矢量分配的内存
- 如果操作系统未清除内存泄漏,则在程序完成后内存泄漏是否仍然存在?
- C++ 清除动态阵列中的内存 - 内存无法清除
- 如何在C ++中清除已删除对象的内存?
- thread_local std::list 是否会在呼叫清除时放弃分配的内存
- 如何使用删除 [] 运算符清除动态分配的内存?(无法使用常规删除语法清除)
- 如何正确清除内存
- delete命令会清除用new分配的内存吗
- 与对象一起返回时清除了内存指针
- 有效清除矢量内存
- 为什么运算符 new 清除的内存多于请求的内存
- 在函数中返回向量后清除内存
- 矢量<string>在超出范围后不清除内存
- 如何在c语言中清除内存
- 这是清除内存块(或SDL表面)的最快方法
- uBLAS矩阵清除内存
- 什么是delete指针,指针=0;表述功?它清除内存两次吗?
- 加载着色器后清除内存