2014-01-10 6 views
0

Я создаю модульную функцию, и я не понимаю, почему я получил ошибку сегментации после освобождения моего модуля.Сегментация Ошибка при вызове 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); 
} 
+3

'.h' файл ?? 'Главный()' ?? –

+2

Как в сторону, я бы не рекомендовал называть ваши переменные «этим». Это смущает людей C++ и делает их действительно запутанными, если вы когда-либо конвертируете код в C++. Назовите это «я» вместо этого или что-нибудь более описательное. – acarlon

+0

@acarlon, ты слишком прав! Когда я увидел «бесплатно (это)», я сделал: O лицо в течение как минимум 5 секунд ... –

ответ

3

free следует использовать для свободных указателей, которые были выделены с помощью malloc. Строка test была размещена на стеке . Как Альфей указывает:

String* test = (String*)malloc(sizeof(String)); 
StringInit(test, str); 
StringDestroy(test); 

И как ответ Адриано указывает, вы также выделили новую строку с strdup. Похоже, здесь есть множество проблем!

+0

Правильно. Вы можете изменить свой код, используя 'String * testp; testp = (String *) malloc (sizeof String); 'и затем использовать' StringInit (testp, str); StringDestroy (testp); ' – Alfe

+0

Вы правы, он звонит бесплатно на объект, выделенный стек, но точка ИМО освобождает ** неправильный объект ** (« это »вместо« str »). Если он просто выделяет String с помощью malloc(), то он получает утечку из-за strdup. –

+0

+1, избили меня, пока я редактировал, чтобы сделать код немного более читаемым. :) – Keeler

4

Вы должны позвонить бесплатно для this->str, а не для this (потому что вы выделили новую строку с strdup). Кроме того установить члена NULL не освобождает его:

if (this == NULL || this->str == NULL) 
    return; 

free(this->str); 
this->str = NULL; 

Все остальное в вашем коде работает, как ожидалось, можно выделить объекты на стеке (только помните, что вам не нужно, чтобы освободить их).

Смежные вопросы