我有这样的代码:我分配了两次日志,是否有第一个和日志的潜在内存泄漏?
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)
是的,代码将泄漏,因为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)