考虑这个程序:
int main(void)
{
int* i = malloc(sizeof(int));
int* j = malloc(sizeof(int));
}
然而,这是一种幼稚的方法,因为malloc
可能会失败并且指针不是free
'd。
所以你可以这样做:
int main(void)
{
int* i;
int* j;
if ((i = malloc(sizeof(int)) < 0)
{
return -1;
}
if ((j = malloc(sizeof(int)) < 0)
{
free(i);
return -1;
}
free(i);
free(j);
}
但是我认为这很容易出错。考虑必须分配 20 个指针,在最后一个malloc
错误情况下,您必须分配free
19 个变量,然后return -1
.
我也知道atexit
,这可以帮助我这样写:
int* i;
int* j;
void del_i(void)
{
free(i);
}
void del_j(void)
{
free(j);
}
int main(void)
{
if ((i = malloc(sizeof(int)) < 0)
{
return -1;
}
else
{
atexit(del_i);
}
if ((j = malloc(sizeof(int)) < 0)
{
return -1;
}
else
{
atexit(del_j);
}
}
哪个更好,但我不喜欢必须将所有指针声明为全局指针。有没有办法将这两种方法结合起来,基本上:
- 具有指针的析构函数,可以直接执行或与
atexit
. - 具有指向函数的本地指针。