标题:轻松解决 内存泄漏
只看楼主
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
好像不通用呀!@!

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-07-02 23:18
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
得分:0 
受教了。

南国利剑
2010-07-03 03:24
楼主
Rank: 1
等 级:新手上路
帖 子:21
专家分:3
注 册:2010-6-18
得分:0 
菜鸟路过。大才之作,未能读会,表示遗憾。
2010-07-19 11:00
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
回复 楼主 BlueGuy
这个只能检查自己的代码,而不能检查别人未参照此模式编写的已有代码
如果都重新改写的话,挺有工作量的!

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-07-19 22:12
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
以下是引用BlueGuy在2010-6-29 21:54:51的发言:

为了解释方便,假设现在程序需要载入500张图片。

给图片结构体 定义一个  id;
typedef struct bgImage
{
   int id;
   char* buffer;
   int width;
   int height;
}BGImage;
typedef BGImage* Image;

定义一个 int inspect[500] (初始化为 0)数组来监视内存。
给每个文件名编号,从100开始,(之所以不从0开始编号,是为了处理方便),然后101 ,...

(1)
每次载入图片的时候,根据路径名计算出 图片id。
bgMalloc()
{
    ID = (path[0]-'0')*100 + (path[1]-'0')*10 + (path[0]-'0');
    img->id =  ID;   
    inspect++;
    for (i = 0; i < 500; i++)
    {
        if (inspect > 1)
           printf("内存泄漏");
    }

(2)
每次释放图片的时候
bgFree(Image img)
{
    inspect--;
    free(img->buffer);
    img->buffer = NULL;
    free(img);
    img = NULL;
}

(3)
在某个时刻,根据 监视数组 判断内存是否泄漏。比如程序退出的时候。
for (i = 0; i < 500; i++)
{
    if (inspect > 0)
       printf("内存泄漏");
}
ID = (path[0]-'0')*100 + (path[1]-'0')*10 + (path[0]-'0');
    img->id =  ID;   
    inspect[img->id - 100]++;
这里可能有问题,img->id - 100 < 0  ? 而且这个 ID可能重复?

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-07-19 22:15
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:0 
回复 25楼 vfdff
文件的id是从 100编号的, 这样编号也很容易理解,/
编号重复的责任在于编号者自己, 可以写批处理,也可以用工具编号, 没有人手工去编号的

我用的内存检测工具只能大概的报个地点, 却不能明确的指出是哪一个文件多次载入了,所以我写了这个简单的东西,
如果不能减少劳动力, 我是不会做那样的傻事的,

这个小方法可以 检测句柄泄露、内存泄露(fopen/fclose, malloc/free配对)


[ 本帖最后由 BlueGuy 于 2010-7-19 22:37 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-07-19 22:30
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:0 
回复 24楼 vfdff
不是的, 应该是都适用的。
不管是未释放内存,还是多次释放内存都能检测出来的, 因为文件编号是唯一的,/
除非那代码逻辑乱的不成样子了。

一个值得注意的地方就是 应该把内存分配和释放代码 封装在自己写的函数里, 这样就可以统一测试了
全局替换下 free/malloc 为自定义函数
 
不过,很可能我写的有问题, 回家休息了,有空和您讨论。

[ 本帖最后由 BlueGuy 于 2010-7-19 22:48 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-07-19 22:40
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
得分:0 
我真的没看出你这个玩意有什么技术含量。。。

而且我也没看出你这段代码能进行inspect内存。。

其实我想说,如果真的你那段代码能work, 还会有那么多大牛去研究GC (垃圾回收)机制?

其实如果我用你写的ImgMalloc 分配了一个空间,我又有另外一个需求,要拷贝已有的某个image.

你还能根据你的inspect数组判断是否对这个拷贝的副本做Imgfree???
2010-07-19 23:05
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:0 
回复 28楼 Devil_W
你知道c 语言的内存是怎么复制的吗? 没有人去复制整个内存。赋个指针就可以的,如果有人傻B,不去释放源指针指向的内存,那不在我的考虑范围之内,几行代码是不可能满足那么多的需求的。


[ 本帖最后由 BlueGuy 于 2010-7-20 08:50 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-07-20 08:48
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:0 
请教一下, 那些大牛在研究什么样的垃圾回收机制?

我就是真命天子,顺我者生,逆我者死!
2010-07-20 08:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-311668-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.237654 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved