如果我想从返回类型为 char* 的函数中返回 strdup,那么内存泄漏的风险或机会是什么?
char* fun () {
return strdup("hello");
}
int main() {
for(;;)
printf("%s\n", fun());
}
strdup()
返回一个指向新分配的内存的指针,稍后必须使用free()
. 如果你不调用free()
它,你会泄漏内存——在你的例子中,你没有。
您将堆分配的char
指针作为右值返回,因此用户可能会忘记释放它,如您给出的示例所示。
printf("%s\n", fun()); // memory leak
// this is fine
char* string = fun();
printf("%s\n", string);
free(string);
最好要求一个指向char*
in 参数的指针并分配它。
如果你真的想返回这样的指针并使用 C++,你可以使用std::unique_ptr<char>
带有自定义删除器的 a ,free
当你完成它时,它将字符串。
unique_ptr<char, void (*)(char *)> fun () {
return {strdup("hello"), std::free};
}
// then you can use it
printf("%s\n", &*fun());
从手册页:
strdup() 函数返回一个指向新字符串的指针,该字符串是字符串 s 的副本。新字符串的内存使用 malloc(3) 获得,并且可以使用 free(3) 释放。
所以... strdup 分配您必须释放的内存,即您拥有所有权。
风险是间接的。如果有人警告您使用它,可能是因为strdup
调用 malloc 并且此调用未在源代码中明确显示。因此,理论上,如果有人稍后实现了自己的 malloc 实现并尝试捕获您的程序所做的所有分配,则不会捕获此分配。