gpt4 book ai didi

c - 在 C 中每次错误检查后如何避免长链的免费(或删除)?

转载 作者:IT王子 更新时间:2023-10-28 23:30:14 25 4
gpt4 key购买 nike

假设我非常防御性地编写代码,并且总是检查我调用的所有函数的返回类型。

所以我喜欢:

char* function() {
char* mem = get_memory(100); // first allocation
if (!mem) return NULL;

struct binder* b = get_binder('regular binder'); // second allocation
if (!b) {
free(mem);
return NULL;
}

struct file* f = mk_file(); // third allocation
if (!f) {
free(mem);
free_binder(b);
return NULL;
}

// ...
}

注意 free() 事情失控的速度有多快。如果某些功能失败,我必须先释放每个分配。代码很快变得丑陋,我所做的就是复制粘贴所有内容。我成为了一个复制/粘贴程序员,更糟糕的是,如果有人在两者之间添加了一条语句,他必须修改下面的所有代码以调用 free() 进行添加。

有经验的 C 程序员如何解决这个问题?我什么都想不通。

谢谢,博达·赛多。

最佳答案

你可以定义一个新的标签来释放资源,然后你可以在代码失败时转到它。

char* function()
{
char* retval = NULL;
char* mem = get_memory(100); // first allocation
if (!mem)
goto out_error;

struct binder* b = get_binder('regular binder'); // second allocation
if (!b)
goto out_error_mem;

struct file* f = mk_file(); // third allocation
if (!f)
goto out_error_b;

/* ... Normal code path ... */
retval = good_value;

out_error_b:
free_binder(b);
out_error_mem:
free(mem);
out_error:
return retval;
}

此处已讨论过使用 GOTO 进行错误管理: Valid use of goto for error management in C?

关于c - 在 C 中每次错误检查后如何避免长链的免费(或删除)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3339946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com