asprintf():如何释放指针?

How*_*ane 9 c linux

我有这样的代码:我分配了两次日志,是否有第一个和日志的潜在内存泄漏?

char *log = NULL;
asprintf(&log, "Hello: %s", name);
if (known_person== true){
    asprintf(&log, "%s, %s", log, ", my old friend.");
}
free (log);
Run Code Online (Sandbox Code Playgroud)

use*_*109 7

是的,代码将泄漏,因为asprintf既不检查也不尝试重用前一个指针.因此,记忆就丢失了.在您的示例中避免此问题的最佳方法是将代码重写为

char *log = NULL;
if (known_person== true)
    asprintf(&log, "Hello: %s, my old friend.", name);
else
    asprintf(&log, "Hello: %s", name);

free (log);
Run Code Online (Sandbox Code Playgroud)

这样,缓冲区被分配一次并正确释放.

或者,您可以使用两个指针

char *temp = NULL;
asprintf(&temp, "Hello: %s", name);

char *log = NULL;
if (known_person== true) {
    asprintf(&log, "%s, my old friend.", temp);
    free( temp );
}
else {
    log = temp;
}

free (log);
Run Code Online (Sandbox Code Playgroud)

  • 嗯,使用`int asprintf(char**strp,...``我想"如果无法进行内存分配,或者发生其他错误,这些函数将返回-1,并且strp的内容未定义." (2认同)
  • @chux嗯,`asprintf`没有出现在C规范中.在我正在使用的OS X上,手册页说*"如果无法分配足够的空间,asprintf()和vasprintf()将返回-1并将`ret`设置为NULL指针."*所以我猜这就是为什么不应该在便携式代码中使用非标准函数的原因. (2认同)