欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

sgi的内存泄露

发布时间:2024/9/30 44 豆豆
生活随笔 收集整理的这篇文章主要介绍了 sgi的内存泄露 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

在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的内存泄露的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。