在linux下试用一个内存检测工具 valgrind
比我之前一直在用的wIndows下的内存检测lvd要好用多了
valgrind --tool=memcheck --show-reachable=yes --leak-check=yes ./tt
./tt 是要检测的程序
按照网友的例子:
int main() { vector<int> v; v.push_back(100); v.push_back(200); return 0; }用valgrind会有内存泄露,其实也是可以理解的,按照sgi的实现,就等于申请了一个8byte的内存块,由于v是局部变量,所以在程序的结束时会调用其析构函数,就应该把这个内存块还给sgi的内存管理freelist。要注意,并没有释放freelist中内存的操作,所以这块内存等于没有释放。但是现在操作系统会在程序结束时释放程序所占有的内存,所以这里的内存泄露也只是still reachable的内存,不是definitely lost.可以说不算内存泄露。
对于
int main() { int *pi; // use local pointer: real memory leak!!! pi = new int[100]; return 0; }
nt main() { static int *pi; // use static pointer: not a real memory leak!!! pi = new int; return 0; }
但是,我在linux下的实验,就是本问的第一段代码,vector,valgrind没有显示任何的内存泄露。而我自己按照sgi实现的vector却有still reachable的内存泄露。still reachable表明内存还是能找到并释放的,因为我可以通过freelist释放全部的内存,就可以了。
由此可以推断现在用的g++ 4.1.2用的可能不是sgi的stl,或者不是侯捷所用到的sgi。
如果想用到除了标准stl的sgi容器,比如slist或者hash_map,可以这样用
#include <ext/slist> #include <iostream> #include <algorithm> using namespace std; using namespace __gnu_cxx;
在目录 /usr/include/c++/4.1.2/ext/