sgi的内存泄露

本文介绍了使用Valgrind这一强大的Linux内存检测工具的方法及注意事项。通过对比Windows下的内存检测工具LVD,突显了Valgrind的强大功能。文章详细解释了如何利用Valgrind发现不同类型的内存泄露,并探讨了在C++ STL中使用特定容器时可能出现的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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/







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值