【问题标题】:How to deallcate memory allocated to a list?如何解除分配给列表的内存?
【发布时间】:2017-11-07 16:30:14
【问题描述】:

我们如何释放分配给列表的内存?在下面的代码中,即使在清除列表并删除指向列表的指针之后,它也不会释放内存。我可以在系统监视器中看到程序占用的内存。 有没有一种有效的方法来删除分配给列表的内存?

struct Plot
{
    int BUFFER[65535];
    int BUFFER1[65535];
    int BUFFER2[65535];
    int BUFFER3[65535];
    int BUFFER4[65535];
};
int main(int argc, char *argv[])
{

    std::list<Plot> *LIST= new std::list<Plot>();


    Plot PLOT;
int i=0;
while(i<1500)
{

    (LIST)->push_back(PLOT);
    i++;
    usleep(100);
}


LIST->clear();

delete LIST;

while(1)
{
    usleep(100);
}
}

【问题讨论】:

  • 分配的内存被正确释放,没有泄漏。您不能为此依赖系统监视器,因为 C++ 库的内部隐藏了很多东西,例如释放的内存可能不会立即返回给系统,但库可以将其放入它自己的空闲内存池中并且从该池中进行后续分配,而不是直接从系统请求内存。它完全依赖于实现。
  • 如果您担心严格的内存管理,请考虑使用自定义分配器。
  • 这只是一个示例代码。我有类似的代码,其中内存无限增加。 Valgring 还显示了 new 运算符的内存泄漏。
  • @RajatSati 在其他代码中可能存在另一个问题。尝试将你的main函数的内容放入一个无限循环中,我确信内存使用不会无限增加。
  • 不要使用 new,特别是对于 std 容器。不要使用拥有原始指针。

标签: c++ list memory-management memory-leaks stdlist


【解决方案1】:

这个稍加修改的程序正在我的 Windows 机器上运行。

在你的平台上试试这个,看看会发生什么。

(免责声明:这是糟糕的代码,只是为了坚持 OP 的代码。)

#include <list>
#include <windows.h>

struct Plot
{
  int BUFFER[65535];
  int BUFFER1[65535];
  int BUFFER2[65535];
  int BUFFER3[65535];
  int BUFFER4[65535];
};

int main(int argc, char *argv[])
{
  int i = 0;

  while (1)
  {
    printf("Iteration %d\n", i++);

    std::list<Plot> *LIST = new std::list<Plot>();

    static Plot PLOT;
    int i = 0;
    while (i < 1500)
    {
      (LIST)->push_back(PLOT);
      i++;
    }

    LIST->clear();
    delete LIST;

    Sleep(100);
  }
}

这是系统监视器向我显示的内存使用量与时间的关系(一个分区为 1.6 Gb。):

当我运行在发布模式而不是调试模式下编译的同一程序时,系统监视器向我显示的内容完全不同,因为内存分配器的内部实现在发布模式下完全不同:

但正如我们所见,两个版本的内存都被正确释放,程序仍在后台运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2013-06-05
    • 2021-06-22
    • 2020-05-19
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多