标题:free 时出现问题
只看楼主
fantasy_______
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2008-9-21
 问题点数:0 回复次数:13 
free 时出现问题
graph *edge2;

edge2=(graph *)malloc(sizeof(graph)*e);

free(edge2);

这里free错了吗,为什么会出问题
搜索更多相关主题的帖子: free 
2008-12-14 20:15
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
得分:0 
你在malloc(sizeof(graph)后面多加了*e
2008-12-14 20:31
woshiyun
Rank: 1
等 级:新手上路
威 望:2
帖 子:348
专家分:0
注 册:2008-6-16
得分:0 
但看这3句,如果e是一个数值的话,
肯定没有错。
2008-12-14 20:55
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
得分:0 
c的删除我不太懂,不过,edge2明显是一个graph对象数组
不知道free删除数组如何做的.
new delete的话,删除数组是:  delete [] edge2;
2008-12-14 21:01
fantasy_______
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2008-9-21
得分:0 
应该是free(地址);没错啊,郁闷那
2008-12-14 21:22
woshiyun
Rank: 1
等 级:新手上路
威 望:2
帖 子:348
专家分:0
注 册:2008-6-16
得分:0 
本来就没有错,是你程序其他地方错了。
2008-12-14 21:24
ssdnsse
Rank: 1
来 自:福建
等 级:新手上路
帖 子:550
专家分:0
注 册:2008-12-14
得分:0 
估计是多了*e

...指针不指向我了   0.0
2008-12-14 21:50
fantasy_______
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2008-9-21
得分:0 
void reform_map(graph *edge,int e)
{
    int i,j,k;
    int start,end;
    graph *edge2;
    char ch;
    edge2=(graph *)malloc(sizeof(graph)*e);//创建一个地图数组的副本
    for (i=1;i<=e;i++)
        edge2[i]=edge[i];
    int v1,v2;
    printf("                      请输入要删除的边:");
    scanf("%d,%d",&v1,&v2);
    for (i=1;i<=e;i++)
    {
        if (edge2[i].v1==v1&&edge2[i].v2==v2||edge2[i].v1==v2&&edge2[i].v2==v1)
        {
            if (edge2[i].weight==0)
            {
                printf("                      该边不在最小生成树中,按任意键继续......");
                getchar();
                return ;
            }
            edge2[i].flag=2;
            MFSet_initial();//重新初始化root数组
            for (j=1;j<=e;j++)//重新构造root数组
            {
                if(edge2[j].flag==1)
                {
                    start=MFSet_find(root,edge[j].v1);
                    end=MFSet_find(root,edge[j].v2);
                    MFSet_merge(root,start,end);
                }
            }
            for (k=1;k<=e;k++)
            {
                if(edge2[k].flag==0)
                {
                    start=MFSet_find(root,edge2[k].v1);
                    end=MFSet_find(root,edge2[k].v2);
                    if(start!=end)
                    {
                        MFSet_merge(root,start,end);
                        printf("                      在%d和%d之间铺设线路,权值为%d\n",edge2[i].v1,edge2[i].v2,edge2[i].weight);
                        edge2[k].flag=1;
                        printf("                      需要打印修改后的最小生成树吗(y/n):");
                        fflush(stdin);
                        ch=getch();
                        if (ch=='y'||ch=='Y')
                        print(edge2,e);
                        free(edge2);
                        return ;
                    }
                    
                }
            }

        }
    }
    printf("                      未找到该条线路,按任意键继续......");
    free(edge2);
    fflush(stdin);
    getch();
}

注释写少了,大家就看看free()有什么错吧
2008-12-14 22:18
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
得分:0 
free(edge2[0]);//这样是可以删除正确的,因为在分配空间时,sizeof(graph)*e,分配了e个对象空间,e是多少?我想应该这样删除
for( int i = 0 ; i < e ; ++i )
    free(edge2[i]);
e大于0,并且e不能太大,小心内存不够.

[[it] 本帖最后由 debroa723 于 2008-12-14 22:23 编辑 [/it]]
2008-12-14 22:21
fantasy_______
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2008-9-21
得分:0 
回复 第9楼 debroa723 的帖子
free()中的参数必须是个指针,edge[i]是结构体变量,编译通过不了
2008-12-14 22:28



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




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

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