免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-25 11:02 |只看该作者 |倒序浏览
本帖最后由 BuTa丶潇 于 2013-07-25 12:57 编辑

不好意思 我有一个问题,貌似是内存泄漏..
我查了几遍,都没找到问题原因..

代码内容大致:
就是我插入几个元素 然后放到链表里..
最后释放的时候
释放完 再遍历 还是有数据..

代码如下,大概就几十行,可以直接运行看到问题..
麻烦谁帮忙看下哪里出的问题吧..谢谢谢谢...

#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);
        }
    return;
}

//如果有重复的 那么就忽略,即return 1;
//如果没重复的 那么就追加到链表的最后.
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;
    }

}

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

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2013-07-25 11:19 |只看该作者
valgrind跑一次

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


    这个是我当时想测试下 释放完毕后,他是否还存在数据...

如果正常的话 他应该不会进入到这里..


这个就是我不太理解的地方..我释放完毕了怎么还有数据..

**内存泄漏的问题呢..求赐教..谢谢谢谢...

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

论坛徽章:
0
6 [报告]
发表于 2013-07-25 11:53 |只看该作者
我估计你是释放函数的参数传递出了问题,函数传值不传址,释放后要将指针置为空

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

论坛徽章:
0
8 [报告]
发表于 2013-07-25 13:24 |只看该作者
回复 7# pmerofc


    嗯 你的意思是我访问了已经释放的内容,所以导致出错是吗..

我在释放的时候 释放完毕后,设置指针为NULL,

之后是因为想看下是否释放完全,所以在外面访问的时候,先判断是否为NULL,然后才访问的..正常的话不是不应该进入if条件的吗..

不好意思 有点迷糊...能不能麻烦再详细讲解一下 谢谢谢谢..

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

+1                                   

论坛徽章:
0
10 [报告]
发表于 2013-07-25 13:34 |只看该作者
回复 3# lxyscls


    谢谢,我接触c没多久 , 还没用过这个东西..我去网上看下..
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP