gpt4 book ai didi

c - 无论返回码如何,都在循环中释放内存

转载 作者:行者123 更新时间:2023-12-03 07:39:50 26 4
gpt4 key购买 nike

我有以下 C 伪代码:

int main()
{
int rc = 0;

for (int i = 1; i < 10; i++) {
char *data = malloc(i); // Each iteration has a different alloc size

rc = do_something(data);
if (rc != 0) goto cleanup;

rc = do_something_else();
if (rc != 0) goto cleanup;

cleanup:
free(data);
if (rc != 0) break;
}
return rc;
}

我想通过在被调用函数返回错误时跳出循环来模拟 Python 的 try...finally 模式,但前提是在执行一些必要的清理工作之后。

到目前为止代码对我来说看起来还不错,但我是 C 的新手。是否有不同的模式可以避免 free 之后重复的 rc != 0 测试? (我知道有些人认为 goto 无条件错误,但我认为这是我为这种情况找到的最干净的解决方案。)

最佳答案

在您显示的特定代码/案例中,您可以使用 realloc 消除任何类型的每循环清理的需要。函数而不是 malloc。这将简单地用一个新 block (不同大小)替换在前一个循环(如果有的话)上分配的内存。然后,您可以简单地将任何清理(即调用 free)推迟到循环之外。

每当发生错误时,您仍然可以使用 break 语句退出循环;或者,如评论中所述,您可以向循环条件添加 rc != 0 测试。

这里有一些 C 代码可以按照我的指示执行(但是,当然,您需要两个调用函数的实际定义才能工作):

#include <stdlib.h>
int do_something(char* data);
int do_something_else(void);

int main()
{
int rc = 0;
char* data = NULL;
for (size_t i = 1; i < 10; i++) {
char* temp = realloc(data, i); // If "data" is NULL (1st loop) -> same as malloc
if (temp == NULL) { // Allocation failure...
// Error message
break;
}
data = temp; // Succesfull allocation, so update "data" pointer

rc = do_something(data);
if (rc != 0) break;

rc = do_something_else();
}
free(data); // We now only have to do the cleanup once (calling with NULL is allowed).
return rc;
}

随时要求进一步澄清和/或解释。

关于c - 无论返回码如何,都在循环中释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62642265/

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