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