我们有这样的代码:
void main(){
std::list<int *> ll;
for(int i=0;i<100;i++)
{
int *a = new int[10000];
ll.push_back(a);
}
for(int *b : ll)
{
delete [] b;
}
ll.clear();
}
但记忆不是免费的吗? 为什么? 运行时此代码正常工作:
void main(){
for(int i=0;i<100;i++)
{
int *a = new int[10000];
delete [] a;
}
}
我在linux和系统监控中使用top命令监视内存,所以在第一个代码中首先是内存正在上升,之后我希望应用程序最后释放内存而不是空闲内存。
答案 0 :(得分:4)
用顶级命令和系统监控[我监控内存]在linux中
这种方法不会给你一个准确的结果。 Linux top
命令告诉您进程保留多少内存,其中包括分配器从OS请求的内存。 top
不知道分配器为您的程序提供了多少内存,以及将来为您的程序提供了多少内存。
为了检查程序是否存在内存泄漏和其他与内存相关的错误,请使用内存分析工具,例如valgrind。探查器将检测内存泄漏,并通知您程序中已分配未返回分配器的内存块的位置。
注意:您的其他代码似乎工作的原因是分配器需要的内存要少得多,因为在循环中重复分配和解除分配相同的内存块。
答案 1 :(得分:3)
与其他人一样,valgrind是追踪内存泄漏时使用的合适工具。在程序中使用valgrind确实表明你没有内存泄漏:
$ valgrind --leak-check=yes ./example
==3945== Memcheck, a memory error detector
==3945== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==3945== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==3945== Command: ./example
==3945==
==3945==
==3945== HEAP SUMMARY:
==3945== in use at exit: 0 bytes in 0 blocks
==3945== total heap usage: 200 allocs, 200 frees, 4,002,400 bytes allocated
==3945==
==3945== All heap blocks were freed -- no leaks are possible
==3945==
==3945== For counts of detected and suppressed errors, rerun with: -v
==3945== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)