strdup()导致内存泄漏?

时间:2015-10-19 22:06:08

标签: c memory-leaks strdup

我已经实现了一个返回字符串的函数。它将整数作为参数(age),并返回格式化的字符串。

一切都运行良好,除了我有一些疯狂的内存泄漏。我知道strdup()是导致这种情况的原因,但我试图研究一些修复无济于事。

我的代码是:

const char * returnName(int age) {

    char string[30];

    sprintf( string, "You are %d years old", age);

    return strdup(string);
}

Valgrind的输出是:

==15414== LEAK SUMMARY:
==15414==    definitely lost: 6,192 bytes in 516 blocks
==15414==    indirectly lost: 0 bytes in 0 blocks
==15414==      possibly lost: 0 bytes in 0 blocks
==15414==    still reachable: 0 bytes in 0 blocks
==15414==         suppressed: 0 bytes in 0 blocks

非常感谢您解决此内存泄漏问题的任何帮助。

5 个答案:

答案 0 :(得分:4)

strdup()基本上等同于

char* dup = malloc(strlen(original) + 1);
strcpy(dup, original);

因此,您需要记得在使用完字符串后再致电free()

const char* name = returnName(20);
/* do stuff with name */
free((void*)name);

如果你不打电话给free(),那么valgrind当然会报告泄密。

答案 1 :(得分:3)

首先,RTFM。 : - )

来自man strdup

  

获取新字符串的内存          malloc(3),可以使用free(3)释放。

因此,您需要free strdup分配和返回的空间{。}}。

假设您像这样调用returnName

 const char* str = returnName(3);

完成str后,你可以free这样:

free((char*) str);

需要播放,因为free需要非常量 void*。这种显式转换在这里是正确的,因为returnName实际上应该返回常量数据 1 。在这里调用free只是一个讨厌的实现细节。

1 正如@ M.M在对此答案的评论中所讨论的那样。

答案 2 :(得分:3)

strdup 看起来像这样:

    thread.c: In function ‘fnc’:
thread.c:24:24: error: cannot convert to a pointer type
         int i=((struct v*)data[l]).i;//Row No
                        ^
thread.c:24:35: error: request for member ‘i’ in something not a structure or union
         int i=((struct v*)data[l]).i;//Row No
                                   ^
thread.c:25:24: error: cannot convert to a pointer type
         int j=((struct v*)data[l]).j;//Column No
                        ^
thread.c:25:35: error: request for member ‘j’ in something not a structure or union
         int j=((struct v*)data[l]).j;//Column No
                                   ^
thread.c: In function ‘main’:
thread.c:48:20: error: request for member ‘i’ in something not a structure or union
             data[k].i = i; //assign the row of C for thread to calculate
                    ^
thread.c:49:20: error: request for member ‘j’ in something not a structure or union
             data[k].j = k; //assign the column of C for thread to calculate

正如您所看到的,还有char *strdup(const char *str){ size_t n = strlen(str) + 1; char *dup = malloc(n); if(dup){ strcpy(dup, str); } return dup; } ,这意味着在您使用malloc动态分配内存后的某个时刻,您不必在strdup之后使用free它已经了。

答案 3 :(得分:1)

内存泄漏的原因不是来自对strdup()的调用,而是因为发布函数的调用者在完成字符串时未能将返回的指针传递给free()。​​

答案 4 :(得分:1)

const char * returnName(int age) {
    char string[30];
    sprintf( string, "You are %d years old", age);
    return strdup(string);
}

returnName()的返回类型为const char*。因此,您无法将返回值保存为char*类型变量。将返回值保留为const char*变量,将cast保留为char*,同时记忆free

const char* retName = returnName(3);
// Use retName
free((char*)retName);