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
我们非常感谢您解决此内存泄漏问题的任何帮助。
首先,RTFM。 🙂
来自man strdup
:
使用
malloc(3)
获取新字符串的malloc(3)
,可以使用free(3)
释放。
所以你需要free
strdup
分配和返回的空间。
假设您像这样调用returnName
:
const char* str = returnName(3);
完成str
你可以像这样free
它:
free((char*) str);
需要强制转换因为free
需要非const void*
。 这种显式转换在这里是returnName
,因为returnName
实际上应该返回常量数据1 。 free
电话只是一个讨厌的实施细节。
1正如@MM在对本答案的评论中所讨论的那样。
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当然会报告泄漏。
strdup看起来像这样:
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
它。
内存泄漏的原因不是来自对strdup()的调用,而是因为发布函数的调用者在完成字符串时未能将返回的指针传递给free()。
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*
变量并将其转换为char*
同时使内存free
const char* retName = returnName(3); // Use retName free((char*)retName);