从返回类型为char *的函数返回strdup的风险?

时间:2014-04-02 12:40:59

标签: c++ c strdup

如果我想从返回类型为char *的函数返回strdup,那么内存泄漏的风险或机会是什么?

char* fun () {
    return strdup("hello");
}

int main() {
    for(;;)
    printf("%s\n", fun());
}

4 个答案:

答案 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实现,并尝试捕获程序生成的所有分配,那么这个分配就不会被捕获。

相关问题