当前位置:
首页 >
sgi的内存泄露
发布时间:2024/9/30
44
豆豆
在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; }
就是definitely lost,因为pi是局部变量。sgi的freelist是static,其就类似于下面的代码
nt main() {static int *pi; // use static pointer: not a real memory leak!!!pi = new int;return 0; }
这是still reachable的,因为pi是静态的,全局的
但是,我在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/
总结
- 上一篇: sgi 之vector
- 下一篇: 单链表之快排