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

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

本文关键字:函数 释放 分配 内存 C++ 程序 结束      更新时间:2023-10-16
是否可以

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

我的情况基本上是这样的。 我有一个 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 成语。在大多数情况下,实现这一目标的方法是:

    尽可能
  1. 在本地声明变量(在堆栈上)。
  2. 如果您需要在堆上放置某些内容(使用运算符new则使用unique_ptr作为您的第一个选项。 仅在需要时shared_ptr。避免裸指针。

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

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

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

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