首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 能这样释放malloc()分配的内存吗? [已结贴,结贴人:wangbin995]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-10 17:49:04 楼主
    前面的东西我就不打了
    把主要的地方打出来,如下:
    .............
    current = head; //head 是头指针
    while(head != NULL)
    {
        free(current);
        current = current->head;
    }

    那个current被释放之后不会变成野指针吗?又怎了能指向它的下一个节点呢?
    高手给释疑下

    这是 C primer 第四版里的程序
    30  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • akirya
    • 等级:
    发表于:2008-04-10 17:52:531楼 得分:10
    当然不对了
    free之后就不能使用了,你得先保存要访问的指针才可以
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-10 18:15:442楼 得分:0
    这是C primer 第四版里高级数据结构那一章讲链表的时候释放内存用的代码
    看了一下我就傻了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-10 18:20:563楼 得分:0
    书里面的印刷错误
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-10 18:29:364楼 得分:0
    这样写不安全,很可能出现严重错误。一是while中的条件错误,二是野指针错误。可以这样来写:
    current = head; //head 是头指针
    while(current != NULL)
    {
        temp = current->head;//这里的成员怎么会是head,应该是next吧?
        free(current);
        current = temp;
    }
    head = NULL;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-10 18:31:145楼 得分:0
    current = current->head;
    current->head是什么东西??
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-10 18:34:386楼 得分:0
    打错了,那里是current = current->next;
    我的意思只是说它不保存current,直接释放current,然后让current = current->next应该不能的吧,current那个时候不是成为野指针了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ming4098
    • 等级:
    发表于:2008-04-10 21:24:097楼 得分:0
    已经释放了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-10 21:30:418楼 得分:0
    是的,有问题。
    要先保存next后再free.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-10 21:42:379楼 得分:0
    似乎是链表吧应该
    释放了就不应该用了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-10 22:25:3410楼 得分:0
    尽信书不如无书
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-10 22:26:0411楼 得分:0
    引用 1 楼 akirya 的回复:
    当然不对了
    free之后就不能使用了,你得先保存要访问的指针才可以
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-10 22:39:2712楼 得分:0
    错了吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-10 23:47:1013楼 得分:10
    > current = head; //head 是头指针
    > while(head != NULL)
    > {
    >    free(current);
    >    current = current->next;
    > }
    > 那个current被释放之后不会变成野指针吗?又怎了能指向它的下一个节点呢?
    current 被释放后,确实是变成野指针了。
    但是在单线程独立进程空间的程序中,执行到下一条语句“current = current->next;”时,被释放的内存的数据仍然是那个地址,仍然是那个值。这属于逻辑不通,现实通的那种。
    当然,这样虽然可以正确运行,但是如果没有必要,不推荐这种写法。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 00:17:5514楼 得分:0
    while(head != NULL)
    {
        free(current);
        current = current->head;
    }

    虽然free了current所指向的内存,但是current还是指向这段内存的,也就是说current->next还是可以找到的。

    你free的目的是为了让别人来申请使用这段内存。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 00:29:4315楼 得分:0
    你应该明白free到底做了什么。。。

    不过这种方法不推荐
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 05:00:5816楼 得分:0
    不能这么用,自信点。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 08:31:1517楼 得分:0
    大师也有犯错时候
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 08:42:0718楼 得分:0
    这个题目也不能完全说是错误

    你虽然free了 但是 没有写current=NULL;(这句是避免野指针)

    所以实际上current仍然指向 head地址空间 只不过是这片空间被free(注意free只是说明这片空间可以被其他程序申请开辟,如果没有被其他程序使用
    那么它的内容不会改变)

    程序这样写一般是能正常通过并且能出正确的结果,但是建议你不要这样写 如果程序大了 它可能成为你程序的漏洞
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 08:45:2019楼 得分:0
    引用 1 楼 akirya 的回复:
    当然不对了
    free之后就不能使用了,你得先保存要访问的指针才可以
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 08:55:5320楼 得分:0
    引用 18 楼 liyuzhu_1984 的回复:
    ......
    程序这样写一般是能正常通过并且能出正确的结果,但是建议你不要这样写 如果程序大了 它可能成为你程序的漏洞


    漏洞,一般说来,到还不至于。只要是独立地址空间的单线程进程就不会错。

    当然,前面我也说了,不推荐这种写法。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 09:36:1721楼 得分:0
    C/C++ code
    // 代码不对 current = head; //head 是头指针 while(current != NULL) { tmp = current->next; free(current); current = tmp; } 这句话说得对:要自信点!

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 10:40:2422楼 得分:0
    该回复于2008-04-11 18:18:36被版主删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 11:07:5323楼 得分:0
    引用 10 楼 myullian 的回复:
    尽信书不如无书
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • con_con
    • 等级:
    发表于:2008-04-11 11:12:1324楼 得分:0
    引用楼主 wangbin995 的帖子:
    前面的东西我就不打了
    把主要的地方打出来,如下:
    .............
    current = head; //head 是头指针
    while(head != NULL)
    {
        free(current);
        current = current->head;
    }

    那个current被释放之后不会变成野指针吗?又怎了能指向它的下一个节点呢?
    高手给释疑下

    这是 C primer 第四版里的程序


    没问题
    被释放之后,虽然没有置为NULL,但是已经是另外一个值(current->head)了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 11:36:5825楼 得分:0
    引用 13 楼 rushman 的回复:
    > current = head; //head 是头指针
    > while(head != NULL)
    > {
    >    free(current);
    >    current = current->next;
    > }
    > 那个current被释放之后不会变成野指针吗?又怎了能指向它的下一个节点呢?
    current 被释放后,确实是变成野指针了。
    但是在单线程独立进程空间的程序中,执行到下一条语句“current = current->next;”时,被释放的内存的数据仍然是那个地址,仍然是那个值。这属于逻辑不通,现实通的那…



    引用 14 楼 ykklv 的回复:
    while(head != NULL)
    {
        free(current);
        current = current->head;


    虽然free了current所指向的内存,但是current还是指向这段内存的,也就是说current->next还是可以找到的。

    你free的目的是为了让别人来申请使用这段内存。


    只是使用不安全,也不推荐,小程序无所谓,大的就很难说了,尤其是多次malloc的地方。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 11:51:0326楼 得分:0
    菜鸟啊,我是
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 14:07:3027楼 得分:0
    释放以后的内存如果没有被改写,这样写也可以正常运行,此时,野指针还没发疯;如果释放的内存被改写了,野指针就发疯了(是让用户发疯了)。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 16:30:2928楼 得分:0
    wo ye shi cainiao
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • CCTV3000
    • 等级:
    发表于:2008-04-11 17:23:3329楼 得分:0
    绝对是错误,你的代码不能依赖于free的内部实现。
    如果你自己尝试过实现一些定制的内存分配器,你就该知道,很多内存分配算法在释放一块内存区时就会改写其中的内容。
    偶尔能够正常运行不代表可行,这不是一种不推荐的写法,而是错误的写法。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 18:11:3630楼 得分:0
    引用 21 楼 wjlsmail 的回复:
    C/C++ code//代码不对current=head;//head 是头指针while(current!=NULL)
    {
        tmp=current->next;
        free(current);
        current=tmp;
    }

    这句话说得对:要自信点!

    支持!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 20:01:1831楼 得分:0
    学习来了
    标记一下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 20:54:3132楼 得分:0
    引用 14 楼 ykklv 的回复:
    while(head != NULL)
    {
        free(current);
        current = current->head;


    虽然free了current所指向的内存,但是current还是指向这段内存的,也就是说current->next还是可以找到的。

    你free的目的是为了让别人来申请使用这段内存。

    书上当然也有错的地方,呵呵!不可以完全相信……
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 21:00:3033楼 得分:0
    路过学习.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 21:05:4134楼 得分:0
    jf
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-11 23:23:1235楼 得分:0
    jf
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-12 01: