我已经实现了一个返回字符串的函数。它将整数作为参数(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
非常感谢您解决此内存泄漏问题的任何帮助。
答案 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);