Chinaunix首页 | 论坛 | 博客
  • 博客访问: 208319
  • 博文数量: 80
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 824
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-12 21:40
个人简介

只有今天的埋头,才有明天的出头。

文章分类

全部博文(80)

文章存档

2014年(80)

我的朋友

分类: C/C++

2014-07-21 14:18:22

这是因为有时为了避免内存泄露,用do{ }while(0)执行块内的语句,然后跳出循环块,统一释放内存,具有特殊意义。例如:
#include
#include


int func(int n)
{
    int i = 0;
    int ret = 0;
    int* p = (int*)malloc(sizeof(int) * n);
    
    do
    {
        if( NULL == p ) break;
        
        if( n < 0 ) break;
        
        for(i=0; i         {
            p[i] = i;
            printf("%d\n", p[i]);
        }
        
        ret = 1;
    }while(0);
    
    free(p);
    
    return ret;
}


int main()
{
    if( func(10) )
    {
        printf("OK");
    }
    else
    {
        printf("ERROR");
    }
}

如果改为这样:
#include
#include


int func(int n)
{
    int i = 0;
  //  int ret = 0;
    int* p = (int*)malloc(sizeof(int) * n);
    
   // do
   // {
        if( NULL == p ) return 0;
        
        if( n < 0 ) return 0; //每次return后p的内存还没释放,就会内存泄露
        free(p);    //加上这个释放就解决问题,但当函数有很多个时候,就得写很多次free,一不小心就会导致内存泄露
        for(i=0; i         {
            p[i] = i;
            printf("%d\n", p[i]);
        }
        
        ret = 1;
   // }while(0);
    
    free(p);
    
    return ret;
}


int main()
{
    if( func(10) )
    {
        printf("OK");
    }
    else
    {
        printf("ERROR");
    }
}

阅读(1371) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~