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

force a program to free memory allocated during a function after that function ends (C++)

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

我的情况基本上是这样的。我有一个 for 循环调用另一个函数然后做一些事情 returns。这个其他函数(下面代码中的 myfunction)然后调用一个我无法控制的函数(下面代码中的 otherpersonsfunction)。每次我的程序调用 otherpersonsfunction 时,内存使用量都会增加并且不会下降。如果 otherpersonsfunction 只被调用一次或两次,这不是问题,但如果 myvector 变得非常大,那么我将多次调用它(足以导致服务器 运行 宁到 运行 内存不足至少一次)。我无法更改 otherpersonsfunction 的工作方式,所以我想知道的是,一旦调用完成,是否有可能强制程序清除调用 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;
}

如果在你的函数中获取内存:
然后按照RAII成语。在大多数情况下实现这一点的方法是:

  1. 尽可能在本地(在堆栈上)声明变量。
  2. 如果你需要在堆上放置一些东西(使用 new 操作符)然后使用 unique_ptr 作为你的第一个选项。 shared_ptr 仅在需要时使用。避免裸指针。

如果在别人的代码中获取内存:
据我所知,除了访问他的代码并修复它之外,你无能为力。

假设另一个函数完全不受您的控制,并且该函数正在使用标准内存分配器,那么答案是否定的。即使在技术上可行,这样做也是不安全的,因为指向您强行释放的内存的指针最终可能会保存在某个地方,并且在以后使用它时会发生各种有趣的事情。

如果可以将其他函数转换为使用某些自定义分配器,答案将更改为是(假设您验证在调用之间未保存指针;幸运的是,使用自定义分配器,包括 libc 在内的其他库不可用等式因此它是可行的)。

如果在函数中分配,然后在函数结束时释放,我建议使用堆栈而不是堆变量。它也更快,但显然并不总是可能的。

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

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