免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4360 | 回复: 5
打印 上一主题 下一主题

下面这段代码把分配的内存释放掉了吗?如何查看分配的内存是否被释放? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-28 13:22 |只看该作者 |倒序浏览
下面这段代码把分配的内存释放掉了吗?有什么方法可以查看进程分配的内存是否被释放?

int
main(int argc, char **argv)
{
        char **p;
        char *p1;
        char *p2;
        char *p3;

        *p = (char *)malloc(24);

        p1 = (char *)p;
        p2 = (char *)(p + 8);
        p3 = (char *)(p + 16);

        free(p1);
        free(p2);
        free(p3);

        return 0;
}

论坛徽章:
0
2 [报告]
发表于 2007-06-28 17:13 |只看该作者
*p = (char *)malloc(24);//这样是不是会有问题呢?

论坛徽章:
0
3 [报告]
发表于 2007-07-06 09:30 |只看该作者
原帖由 asdf511 于 2007-6-28 17:13 发表于 2楼  
*p = (char *)malloc(24);//这样是不是会有问题呢?


这样倒是没问题的,有时候我们会看到这样的函数

int createXXXX(XXXX** pX);

在函数内部给*pX分配内存。跟这里做的是一样的。


只是楼主的3个free是错的。
p1, p2, p3都是把一个char**强转成char*...... p本身并没有指向分配的内存啊。
也许LZ是想写成类似于p1 = (char*)(*p) ?
那free p2,p3也是不对滴。malloc和free要一一对应。


查看某块内存是否被释放可能没什么好方法吧,有个简单一点的,有点帮助的方法,就是封装malloc和free,malloc出来的内存都填充一个特殊的数,free之后的内存都填充另一个特殊的数。比如VC里debug版本下,malloc出来的就全是CDCDCD....(? 记不清)。 对一个指针来说,可以查看它前后是不是都是这样特殊的数,来判断该内存是否已经被释放。当然这个方法并不是充分的。

如果要严格控制和了解内存的使用情况,可能需要自己实现memory pool了。这样,对于任一指针判断它是否已经被释放,那方法可能就比较多,我没研究过,现在我想到最直白的方法就是另外找一个1/8大小的数组,每一个bit标志pool中每一个字节,哈哈,很丑很丑。

论坛徽章:
0
4 [报告]
发表于 2007-07-06 10:10 |只看该作者
早就越界了。
p指向的是保存有 malloc(24)空间的地址的地址。*p才是正确的空间指针。
free了p就铁定找不到你分配的空间了,顺带你的free还有可能溢出。

起码你也要free(*p1)
p2,p3完全没必要free

[ 本帖最后由 yupp 于 2007-7-6 10:12 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-07-06 10:19 |只看该作者
原帖由 yupp 于 2007-7-6 10:10 发表于 4楼  
早就越界了。
p指向的是保存有 malloc(24)空间的地址的地址。*p才是正确的空间指针。
free了p就铁定找不到你分配的空间了,顺带你的free还有可能溢出。

起码你也要free(*p1)
p2,p3完全没必要free

这句没懂 :顺带你的free还有可能溢出
free怎么能溢出??

论坛徽章:
0
6 [报告]
发表于 2007-07-06 18:18 |只看该作者
原帖由 avacool 于 2007-7-6 10:19 发表于 5楼  

这句没懂 :顺带你的free还有可能溢出
free怎么能溢出??


malloc会分配一整块内存给你,并在其内部作记录(具体的实现好像是一链表),现在你free了,这块就回收了。再free,不就有可能溢出了吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP