首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

连续分配多个空间,每个都要判断,如何避免代码冗余

2013-07-04 
连续分配多个空间,每个都要判断,怎么避免代码冗余?加入我在一个函数里想给多个变量连续分配空间,每个分配

连续分配多个空间,每个都要判断,怎么避免代码冗余?
加入我在一个函数里想给多个变量连续分配空间,每个分配都要判断,这样代码就会显得很冗余,有什么好的写法吗?
例如


void fun()
{
//这里不讨论内存泄漏的问题,也不讨论这个函数是不是有用,
//只是讨论当前这种情况怎么写避免代码冗余
void* a,b,c,d;//随便指定几个变量
a = malloc(5);//大小也随便指定一个
if (!a)
return;
b = malloc(5);
if (!b)
{
free(a);
a = NULL;
return;
}
c = malloc(5);
if (!c)
{
free(a);
a = NULL;
free(b);
b = NULL;
return;
}
d = malloc(5);
if (!d)
{
free(a);
a = NULL;
free(b);
b = NULL;
free(c);
c = NULL;
return;
}
}


有什么好的写法呢?
[解决办法]

#define COUNT   (4)
#define SIZE    (5)
void* a[COUNT];
for(i = 0; i < COUNT; i++)
{
    a[i] = malloc(SIZE);
    if(a[i] == NULL)
    {
        for(j = 0; j < i; j++)
        {
            free(a[j];
            a[j] = NULL;
        }
    }
}

[解决办法]
既然只要有一个分配不到就要全部释放掉返回,那为啥不直接这样呢?
void fun()
{
  void*a, *b, *c, *d; //我记得这里*是要重复写的
  a=malloc(20);
  if(!a)
    return;
  b=(char*)a+5;
  c=(char*)a+10;
  d=(char8)a+15;
...

[解决办法]
引用:
Quote: 引用:


#define COUNT   (4)
#define SIZE    (5)


void* a[COUNT];
for(i = 0; i < COUNT; i++)
{
    a[i] = malloc(SIZE);
    if(a[i] == NULL)
    {
        for(j = 0; j < i; j++)
        {
            free(a[j];
            a[j] = NULL;
        }
    }
}



谢谢,对,可以考虑放在一个数组里。

多次调malloc也影响效率。用数组也建议只调一次malloc对指针数组赋值就行了。
[解决办法]
这种goto是C中常用的手法,你可以把它看成是对try-catch结构的一种模拟。
反而那种用无限循环加break的方法很少见。



引用:
Quote: 引用:


void func(void)
{
    if (NULL == (a = malloc(size)))
        goto err;
    if (NULL == (b = malloc(size)))
        goto err;
    ...
    return 0;
err:
    if (NULL != a)
        free(a);
    if (NULL != b)
        free(b);
    ...
    return -1;
}



goto确实也可以,不过一般都是希望不用goto的。

[解决办法]
boost::scoped_ptr<double> a(new double[5]);
boost::scoped_ptr<int>b (new int[6]);
boost::scoped_ptr<long>c (new long[7]);

完全不用考虑释放的问题。

如果不想用boost,自己写一个类似的智能指针也没问题,只不过是在构造函数中初始化,在析构函数中判断并delete[],再重载operator[]操作符。还可以实现一个get()方法来返回裸指针。如果需要将指针返回而不是释放,就再实现一个release交出指针控制权。这些加起来也没多少代码。

热点排行