【发布时间】:2011-11-21 10:19:17
【问题描述】:
给定这样的函数声明:
int base_address(zval *object, int add_prefix, char **base_address TSRMLS_DC) {
int result;
char *host;
long port;
char *prefix;
host = ... get host from object ...;
port = ... get port from object ...;
prefix = ... get prefix from object ...;
result = SUCCESS;
if (asprintf(base_address, "%s:%ld/%s", host, port, prefix) < 0) {
result = FAILURE;
}
return result;
}
void my_func() {
char *base_address;
char *ping_url;
if (base_address(getThis(), 0, &base_address TSRMLS_CC) == FAILURE) {
MALLOC_ERROR();
}
if (asprintf(&ping_url, "%s/ping", base_address) < 0) {
MALLOC_ERROR();
}
... do some stuff with base address ...
// release both, as everything worked
free(base_address);
free(ping_url);
}
如果第一次调用 base_address 成功,第二次调用 asprintf() 失败,我如何干净地跳到函数末尾以安全地释放分配的内存?
在没有太多代码重复或 goto 语句的情况下,是否有一些标准模式如何避免内存泄漏?
【问题讨论】:
-
goto 是你的朋友
-
goto 有什么问题?您可以使用 do while(0) 构造,但这本质上是一回事。
-
@Dani:这不是 C++,所以 RAII 在这里要困难得多。 :-(
-
@PlatinumAzure:该死,有些人还活在石器时代。
标签: c memory-management error-handling