在该函数结束后强制程序释放函数期间分配的内存(C ++)

时间:2015-01-15 20:23:01

标签: c++ memory memory-management

在该函数结束后,是否可以强制程序释放函数期间分配的内存?

我的情况基本上就是这样。我有一个调用另一个函数的for循环然后返回一些东西。这个其他函数(下面代码中的myfunction)然后调用一个我无法控制的函数(以下代码中的其他函数)。每次我的程序调用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;
}

3 个答案:

答案 0 :(得分:0)

如果您的功能获得了内存:
然后按照RAII惯用法进行操作。在大多数情况下实现此目的的方法是:

  1. 尽可能在本地声明变量(在堆栈上)。
  2. 如果您需要在堆上放置一些内容(使用new运算符),请使用unique_ptr作为第一个选项。仅在需要时shared_ptr。避免裸指针。
  3. 如果在其他人的代码中获得了记忆:
    据我所知,除了访问他的代码并修复它之外,你无能为力。

答案 1 :(得分:0)

假设其他功能完全超出您的控制范围且该功能正在使用标准内存分配器,则答案为否。即使技术上可行,这样做也是不安全的,因为指向你强行释放的记忆的指针最终会被保存在某个地方,以后当它被使用时,会发生各种有趣的事情。

如果可以将其他函数转换为使用某个自定义分配器,则答案变为yes(假设您确认在调用之间没有保存指针;幸运的是,使用自定义分配器,其他库包括libc都不在因此它是可行的。)

答案 2 :(得分:0)

如果在函数中分配,然后在函数末尾取消分配,我建议使用堆栈而不是堆变量。它也更快,但显然并非总是可行。

另一个选择是如果你使用C ++ 11来使用try-catch-finally并将你的内存释放代码放在finally原因中。

如果myFunction返回指针,您可以在调用者中删除它们。请记住,某人必须拥有内存的所有权,从其他人下面删除内存是个坏主意。因此,如果myFunction分配内存,返回指针然后消失,再也不会再使用该内存,您可以在调用者中删除它。