void x( )
{
strcpy(a, strdup(p) );
}
(错误)使用strdup进行分配,strcpy不会释放它
有谁能告诉我上述陈述有什么问题以及我收到此错误的原因?
答案 0 :(得分:10)
问题是你在泄漏记忆。对strdup
的调用分配未释放的内存。传递给strcpy
的内存指针永远不会保存在任何地方,因此编译器可以证明它已泄露。
我不确定你要做什么,因为strdup
执行分配和复制,对strcpy
的调用似乎是多余的。
答案 1 :(得分:3)
strdup做类似的事情(取自paxdiablo's answer here): -
char *strdup (const char *s) {
char *d = malloc (strlen (s) + 1); // Allocate memory
if (d != NULL)
strcpy (d,s); // Copy string
return d; // Return new memory
}
SO泄漏已经在strdup中分配的内存会导致该错误。
答案 2 :(得分:2)
问题是strdup
调用malloc()
并将结果指针传递给您的代码。您的代码不会获取已分配内存的所有权并且它已被泄露。您的代码大致是这样做的:
char* duplicate = malloc(strlen(p)+1); //first part of strdup
memcpy(dupliate,p); //second part of strdup
memcpy(a, duplicate);//memcpy in your code
上面的代码没有free()
指向的duplicate
内存。