1

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

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

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

4 回答 4

2

strdup()返回一个指向新分配的内存的指针,稍后必须使用free(). 如果你不调用free()它,你会泄漏内存——在你的例子中,你没有。

于 2014-04-02T12:43:35.540 回答
1

您将堆分配的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());
于 2014-04-02T12:45:30.117 回答
0

从手册页:

strdup() 函数返回一个指向新字符串的指针,该字符串是字符串 s 的副本。新字符串的内存使用 malloc(3) 获得,并且可以使用 free(3) 释放。

所以... strdup 分配您必须释放的内存,即您拥有所有权。

于 2014-04-02T12:43:58.693 回答
0

风险是间接的。如果有人警告您使用它,可能是因为strdup调用 malloc 并且此调用未在源代码中明确显示。因此,理论上,如果有人稍后实现了自己的 malloc 实现并尝试捕获您的程序所做的所有分配,则不会捕获此分配。

于 2014-04-02T12:55:20.730 回答