强制程序在函数结束 (C++) 后释放在函数期间分配的内存
force a program to free memory allocated during a function after that function ends (C++)
强制程序在函数结束后释放函数期间分配的内存?
我的情况基本上是这样的。 我有一个 for 循环,它调用另一个函数并执行一些操作然后返回。 这个其他函数(下面代码中的myfunction)然后调用一个我无法控制的函数(下面的代码中的otherpersonsfunction)。 每次我的程序调用 otherpersonsfunction 时,内存使用量都会增长并且不会回落。 如果 otherpersonsfunction 只被调用一次或两次,这不是问题,但如果 myvector 变得非常大,那么我将多次调用它(足以导致运行它的服务器至少一次内存不足)。 我无法更改其他人函数的工作方式,所以我想知道的是,一旦调用完成,是否可以强制程序清除在调用myfunction期间分配的内存。 我可以在 for 循环中放入一些东西来实现这一点吗?
for(int j = 0; j < myvector.size(); j++)
{
//some code, then a function call
myfunction(myvector.field1);
//force program to free all memory allocated during execution of myfunction.
//How do I do this?
}
myfunction(myvector.field1)
{
//some code, then a function call
otherpersonsfunction(myvector.field1);
return;
}
假设另一个函数完全不受您的控制,并且该函数使用的是标准内存分配器,答案是否定的。即使技术上可行,这样做也是不安全的,因为指向您强制释放的内存的指针最终可能会保存在某个地方,并且当以后使用它时,会发生各种有趣的事情。
如果可以将另一个函数转换为使用一些自定义分配器,则答案将更改为是(假设您验证指针未在调用之间保存;幸运的是,使用自定义分配器,包括libc在内的其他库不在等式中,因此它是可行的)。
如果在函数中获取内存:
然后遵循 RAII 成语。在大多数情况下,实现这一目标的方法是:
- 尽可能
- 在本地声明变量(在堆栈上)。
- 如果您需要在堆上放置某些内容(使用运算符
new
则使用unique_ptr
作为您的第一个选项。 仅在需要时shared_ptr
。避免裸指针。
如果在其他人的代码中获取内存:
据我所知,除了访问他的代码并修复它之外,你无能为力。
如果你在函数中分配,然后在函数结束时释放,我建议使用堆栈而不是堆变量。它也更快,但显然并不总是可能的。
另一种选择是,如果您使用 C++ 11 来使用 try-catch-finally 并将内存释放代码放在 finally 原因中。
如果 myFunction 返回指针,您可以在调用方中删除它们。请记住,某人必须拥有内存的所有权,从其他人下方删除内存是一个坏主意。因此,如果 myFunction 分配内存,返回一个指针,然后消失并且不再使用该内存,则可以在调用器中删除它。
- 调用析构函数以释放动态分配的内存
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- std::unordered_map析构函数不释放内存?
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 如何在 c++ 中的析构函数中正确释放合并 LL 的内存?
- 如何释放 googletest ASSERT_THROW语句中的函数使用的资源?
- 使用析构函数释放链表
- 为什么我不必从 std::string 的函数中释放字符串c_str?
- 从函数内对象的向量中释放内存
- C++ 在不释放内存的情况下调用析构函数
- 函数调用后释放变量
- C++ - 析构函数只是释放内存还是实际删除对象
- 在函数内部错误定位后,从函数中释放返回的指针会导致芯片崩溃
- 构造函数中发生异常时如何释放 API 使用的资源
- 为什么要在释放分配给该对象的内存之前调用该对象的默认析构函数?
- 如何在函数结束时有效地释放矢量内存
- 对于我的类函数,我得到双重释放或损坏错误
- 如果在构造函数中发生异常,如何释放动态内存
- 复制构造函数:释放存储时
- 从 DLL 导出函数释放 CStringArray&参数时的堆冲突