读书人

连续分配多个空间每个都要判断如何

发布时间: 2013-07-04 11:45:55 作者: rapoo

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


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交出指针控制权。这些加起来也没多少代码。

读书人网 >C语言

热点推荐