我正在构建一些模块化功能,我不知道为什么在释放模块后出现分段错误。
我的.h文件
void StringInit(String *this, char const *s)
{
this->str = strdup(s);
printf("%s\n", this->str);
}
void StringDestroy(String *this)
{
if(this == NULL || this->str == NULL)
return;
this->str = NULL;
free(this);
}
int main()
{
char *str;
String test;
str = "hello\n";
StringInit(&test, str);
StringDestroy(&test);
return(0);
}
答案 0 :(得分:4)
您必须为this->str
免费拨打电话,而不是this
(因为您分配了一个包含strdup
的新字符串)。此外,将成员设置为NULL
并不释放它:
if (this == NULL || this->str == NULL)
return;
free(this->str);
this->str = NULL;
代码中的其他所有内容都按预期工作,您可以在堆栈上分配对象(只需记住您不需要释放它们)。
答案 1 :(得分:3)
free
应该用于释放使用malloc
分配的指针。您的test
字符串已在堆栈上分配。正如阿尔菲指出的那样:
String* test = (String*)malloc(sizeof(String));
StringInit(test, str);
StringDestroy(test);
正如阿德里亚诺的回答所指出的那样,你还用strdup
分配了一个新的字符串。好像这里有无数的问题!