【问题标题】:force a program to free memory allocated during a function after that function ends (C++)强制程序在函数结束后释放函数期间分配的内存(C++)
【发布时间】:2015-01-15 20:23:00
【问题描述】:

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

我的情况基本上是这样的。我有一个 for 循环,它调用另一个函数并做一些事情然后返回。这个其他函数(下面代码中的 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;
}

【问题讨论】:

  • en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization 大致就是你想用谷歌搜索的东西。或等待第一个答案解释它:)
  • 看不到样本中明确分配的任何内容?所以你可能根本不需要?
  • 如果otherpersonsfunction是导致内存增长的原因,那么如果没有修改代码的权限,您将无能为力。
  • @crashmstr 是的,我希望不会是这样。
  • 在不知道真正的函数签名以及otherfunction 应该做什么的情况下,不可能知道这是否可以解决,或者您的代码或otherfunction 中是否存在错误。 otherfunction 是否分配了您负责删除的内容?

标签: c++ memory memory-management


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果在您的函数中获得了内存:
    然后关注RAII 成语。在大多数情况下实现这一点的方法是:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-01-25
        • 2012-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多