免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: BuTa丶潇
打印 上一主题 下一主题

[C] 有一个内存泄漏问题 [复制链接]

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
11 [报告]
发表于 2013-07-25 13:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
12 [报告]
发表于 2013-07-25 14:37 |只看该作者
回复 11# pmerofc


    嗯 ,第一次的代码确实有访问已经释放的的内容,当时是想测试下为何已经释放并置null了 却还存在数据.. 现在看来 无意义了,所以改了下..

   我不太清楚你说的风格概念..可能命名不太好,还是注释太少...这些我以后注意..

   我先把逻辑再理一遍,然后看下**问题吧...要不以这个思路走下去,我感觉风格还是老样子..谢谢你哈..

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
13 [报告]
发表于 2013-07-25 15:37 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
14 [报告]
发表于 2013-07-25 17:46 |只看该作者
lxyscls 发表于 2013-07-25 11:19
valgrind跑一次


+1
三楼已经告诉你了很好的解决方式

论坛徽章:
0
15 [报告]
发表于 2013-07-26 08:48 |只看该作者
        uni_name_adr_tmp_listfree(pTmpuni_nam_adr_head);
      
        vCard_uni_nam_adr *xp = pTmpuni_nam_adr_head;
问题就是出在这里,uni_name_adr_tmp_listfree(pTmpuni_nam_adr_head);返回后“pTmpuni_nam_adr_head != NULL”
按照你的用法,要么用二级指针,要么释放完将一级指针置为空

论坛徽章:
0
16 [报告]
发表于 2013-07-26 10:35 |只看该作者
回复 15# dxyf1524


    谢谢你..
我重新修改了下代码,

#include<stdio.h>
#include<string.h>
#include<stdlib.h>


#define MAX_ADDR_LEN        128
#define MAX_LINE_LEN     512
#define pError(x) printf("%s\n",x);
#define tfree(x) { if ( x ) { free(x); x = NULL; } }

typedef struct vCard_unique_name_addr
{
    char name[MAX_LINE_LEN];
    char addr[MAX_ADDR_LEN];
    struct vCard_unique_name_addr* pNext;
}vCard_uni_nam_adr;


static void uni_name_adr_tmp_listfree(vCard_uni_nam_adr ** puni_name_adr)
{
    vCard_uni_nam_adr * pTmpuni_nam_adr_pos = NULL;
    vCard_uni_nam_adr * pTmpuni_nam_adr_next = NULL;
    if(NULL == *puni_name_adr)
    {
        return ;
    }
    pTmpuni_nam_adr_pos = *puni_name_adr;

        for(;pTmpuni_nam_adr_pos != NULL;pTmpuni_nam_adr_pos = pTmpuni_nam_adr_next){
                pTmpuni_nam_adr_next = pTmpuni_nam_adr_pos->pNext;
                tfree(pTmpuni_nam_adr_pos);
        }
        *puni_name_adr =NULL;
    return;
}

static int check_distinct_nam_adr(vCard_uni_nam_adr ** pTmpuni_nam_adr_head , const char *name, const char * addr){
    vCard_uni_nam_adr * pTmpuni_nam_adr_next = NULL;
    vCard_uni_nam_adr * pTmpuni_nam_adr_pos = NULL;
    pTmpuni_nam_adr_pos = *pTmpuni_nam_adr_head ;

    while(pTmpuni_nam_adr_pos != NULL){
        if( strcmp(pTmpuni_nam_adr_pos->name,name)==0 && strcmp(pTmpuni_nam_adr_pos->addr,addr)==0 ){
            return 1;
        }
        pTmpuni_nam_adr_next = pTmpuni_nam_adr_pos;
        pTmpuni_nam_adr_pos = pTmpuni_nam_adr_pos->pNext;
    }

    pTmpuni_nam_adr_pos = (vCard_uni_nam_adr*)malloc(sizeof(vCard_uni_nam_adr));
    if(NULL == pTmpuni_nam_adr_pos)
    {
        pError("Get memory failure while distinct vcard info");
        uni_name_adr_tmp_listfree(pTmpuni_nam_adr_head);
    }
    else
    {
        memset(pTmpuni_nam_adr_pos,0,sizeof(vCard_uni_nam_adr));
        pTmpuni_nam_adr_pos->pNext = NULL;
        strcpy(pTmpuni_nam_adr_pos->name,name ? name : "null");
        strcpy(pTmpuni_nam_adr_pos->addr,addr ? addr : "null");
        
        if(NULL == *pTmpuni_nam_adr_head){
            *pTmpuni_nam_adr_head = pTmpuni_nam_adr_pos;
        }
        else{
            pTmpuni_nam_adr_next->pNext = pTmpuni_nam_adr_pos;
        }
    }
    return 0;
}

int main(void){
    vCard_uni_nam_adr * pTmpuni_nam_adr_head = NULL;

    check_distinct_nam_adr(&pTmpuni_nam_adr_head,"nihao","188888");
        check_distinct_nam_adr(&pTmpuni_nam_adr_head,"hello","55555");
        check_distinct_nam_adr(&pTmpuni_nam_adr_head,"nihao","188888");
        check_distinct_nam_adr(&pTmpuni_nam_adr_head,"hello","188888");
        check_distinct_nam_adr(&pTmpuni_nam_adr_head,"qqqq","000000");

    vCard_uni_nam_adr * pp = pTmpuni_nam_adr_head;
    while(pp != NULL){
//        sleep(1);
        printf("name:%s,addr:%s\n",pp->name,pp->addr);
        pp = pp->pNext;
    }
        printf("==================\n");
       
        uni_name_adr_tmp_listfree(&pTmpuni_nam_adr_head);
       
        vCard_uni_nam_adr *xp = pTmpuni_nam_adr_head;
    while(xp != NULL){
//        sleep(1);
        printf("name:%s,addr:%s\n",xp->name,xp->addr);
        xp = xp->pNext;
    }

}


我发现一个问题 应该是在上面标红的地方, 我把pos指向了adr所指向的内容, 但是把pos指向的内容释放了并置null后,  adr这个指针还是指向这个释放后的空间..所以再访问adr的时候,会出现段错误.
因此需要将adr这个指针也置null,这样就不会出错了..

不知道我这样理解的对不对...

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
17 [报告]
发表于 2013-07-26 11:16 |只看该作者
就个C语言基础, 自己学把, 讨论什么劲.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP