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的内存泄露)