调用free()时出现分段错误

时间:2014-01-10 10:31:44

标签: c unix pointers memory-management free

我正在构建一些模块化功能,我不知道为什么在释放模块后出现分段错误。

我的.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);
}

2 个答案:

答案 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分配了一个新的字符串。好像这里有无数的问题!