免费注册 查看新帖 |

Chinaunix

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

[C++] HEAP Corruption DETECTED错误该怎样解决? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-26 22:45 |只看该作者 |倒序浏览
LinkList ListDel(LinkList l){
    LinkList p,q;
    int i;
    int s;
        printf("\n请输入你要删除的位置:");
        scanf("%d",&s);
   
    while(s>ListSize)
    {
        printf("非法输入!请重新输入:\n");
        scanf("%d",&s);
    }
    if(s==1)
    {
        p=l;
        l=l->next;
        free(p);//单步调试到这儿出的错
        ListSize--;
    }
    else
    {
        q=l;
        for(i=1;i<s-1;i++)
        q=q->next;//用q保存第s个节点的前驱

    p=q->next;
    q->next=p->next;
    free(p);
    ListSize--;
   
    }//end else

    return l;
}

main里的调用是L=ListDel(L);
如果之前在第一个节点前插入过另一节点的话,就不会产生错误。否则显示Debug Error!HEAP Corruption DETECTED……

论坛徽章:
0
2 [报告]
发表于 2007-10-27 00:15 |只看该作者
没发现问题,可能是其它地方有问题吧

论坛徽章:
3
天蝎座
日期:2014-10-25 13:44:312015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:31
3 [报告]
发表于 2007-10-27 12:06 |只看该作者
看标题是C++,看代码怎么又是C啊?

论坛徽章:
0
4 [报告]
发表于 2007-10-27 19:24 |只看该作者
回一楼:哦,谢谢。现在直接把free(p)注释掉了,可以运行。
回二楼:编辑的时候没看到c分类,不好意思。

论坛徽章:
0
5 [报告]
发表于 2007-10-27 19:39 |只看该作者
原帖由 vlinknight 于 2007-10-27 19:24 发表
回一楼:哦,谢谢。现在直接把free(p)注释掉了,可以运行。
回二楼:编辑的时候没看到c分类,不好意思。

你这样会内存泄露

另外,刚发现你的程序在删除头结点时会出现错误,因为你并没有将修改后的头结点指针返回(应该使用LinkList *l传递参数才能将结果返回)

论坛徽章:
0
6 [报告]
发表于 2007-10-29 23:10 |只看该作者

回复 #5 tyc611 的帖子

不太明白。原帖已经把l返回了,LinkList正是指针类型,main里是L=ListDel(L),L是指针。
typedef struct Lnode{
        int data;
        struct Lnode *next;
}Lnode,*LinkList;

这是结点的定义,LinkList算是指针类型了吧?l本身就是指针,LinkList *l作参数的话是指针的指针?下面的next又应该怎么改啊?*l->next不行哦,谢谢。

论坛徽章:
0
7 [报告]
发表于 2007-10-29 23:39 |只看该作者
而且十分奇怪的是当我在第一个结点前再插入一个结点的话(L值已改变)无论后来这个插入结点是否删除,上述错误并不会发生。难道是vc2005的一个bug?

论坛徽章:
0
8 [报告]
发表于 2007-10-30 00:05 |只看该作者
原帖由 vlinknight 于 2007-10-29 23:10 发表
不太明白。原帖已经把l返回了,LinkList正是指针类型,main里是L=ListDel(L),L是指针。
typedef struct Lnode{
        int data;
        struct Lnode *next;
}Lnode,*LinkList;

这是结点的定义,LinkList算是指针类 ...

不好意思,没注意到你的返回值,程序是正确的
是不是你的传入参数有问题?或者你把完全程序拿上来帮你看看

论坛徽章:
0
9 [报告]
发表于 2007-10-30 00:11 |只看该作者

回复 #8 tyc611 的帖子

我也不好意思。终于找到问题了,问题是L的第一次malloc初始化在main里,后面在函数体里free掉头结点好像会导致vc内存检查函数(误判?实际上可以忽略掉继续运行)。现在把main里的初始化改成函数形式了,结果完美通过了,不用注释掉free了。谢谢你的热心。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP