C++ 如何释放分配给列表的内存?

C++ 如何释放分配给列表的内存?,c++,list,memory-management,memory-leaks,stdlist,C++,List,Memory Management,Memory Leaks,Stdlist,我们如何将空闲内存分配给列表?在下面的代码中,即使清除列表并删除指向列表的指针,也不会释放内存。我可以在系统监视器中看到程序占用的内存。 是否有有效的方法删除分配给列表的内存 struct Plot { int BUFFER[65535]; int BUFFER1[65535]; int BUFFER2[65535]; int BUFFER3[65535]; int BUFFER4[65535]; }; int main(int argc, char *a

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

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);
}
}
结构图 { int缓冲区[65535]; int BUFFER1[65535]; int BUFFER2[65535]; int BUFFER3[65535]; int BUFFER4[65535]; }; int main(int argc,char*argv[]) { std::list*list=新std::list(); 情节; int i=0; while(ipush_back(PLOT)); i++; usleep(100); } 列表->清除(); 删除名单; 而(1) { usleep(100); } }
这个稍加修改的程序正在我的Windows计算机上运行

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

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

#包括
#包括
结构图
{
int缓冲区[65535];
int BUFFER1[65535];
int BUFFER2[65535];
int BUFFER3[65535];
int BUFFER4[65535];
};
int main(int argc,char*argv[])
{
int i=0;
而(1)
{
printf(“迭代%d\n”,i++);
std::list*list=新std::list();
静态绘图;
int i=0;
而(i<1500)
{
(列表)->推回(绘图);
i++;
}
列表->清除();
删除名单;
睡眠(100);
}
}
这是系统监视器显示的内存使用与时间的关系(一个分区为1.6 Gb):

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


但是,我们可以看到,两个版本都正确地释放了内存,程序仍然在后台运行。

内存分配正确,没有漏洞。因为C++库的内部隐藏了很多东西,例如不能释放内存,所以不能依赖系统监视器。对于系统来说,但是库可以把它放在它自己的空闲内存池中,然后从该池中进行后续分配,而不是直接从系统请求内存。它完全依赖于实现。如果使用紧内存管理,请考虑使用自定义分配器。这只是一个示例代码。我也有类似之处。内存无限增加的代码。Valgring还显示新运算符的内存泄漏。@RajatSati该代码中可能还有另一个问题。尝试将
main
函数的内容放入无限循环,我确信内存使用不会无限增加。不要使用new,尤其是std容器。不要使用new不要使用原始指针。
#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);
  }
}