Chinaunix

标题: 下面这段代码把分配的内存释放掉了吗?如何查看分配的内存是否被释放? [打印本页]

作者: bekars    时间: 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;
}

作者: asdf511    时间: 2007-06-28 17:13
*p = (char *)malloc(24);//这样是不是会有问题呢?
作者: avacool    时间: 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中每一个字节,哈哈,很丑很丑。
作者: yupp    时间: 2007-07-06 10:10
早就越界了。
p指向的是保存有 malloc(24)空间的地址的地址。*p才是正确的空间指针。
free了p就铁定找不到你分配的空间了,顺带你的free还有可能溢出。

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

[ 本帖最后由 yupp 于 2007-7-6 10:12 编辑 ]
作者: avacool    时间: 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怎么能溢出??
作者: 12013396    时间: 2007-07-06 18:18
原帖由 avacool 于 2007-7-6 10:19 发表于 5楼  

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


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




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2