Что происходит, когда вы пытаетесь освободить () уже освобожденную память в c? - PullRequest
29 голосов
/ 25 сентября 2008

Например:

char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);

Есть ли побочные эффекты от этого?

Ответы [ 14 ]

1 голос
/ 28 сентября 2008

Предположительно странный макрос, приведенный ниже, является полезной заменой для удаления нескольких классов уязвимостей системы безопасности, а также для отладки помощи, поскольку доступ к свободным () 'd-областям с большей вероятностью может вызвать сбои, а не незаметное повреждение памяти.

#define my_free(x) do { free(x); x = NULL; } while (0)

Цикл do-while помогает окружающему коду легче переваривать множественные операторы. например если (сделано) my_free (x);

1 голос
/ 26 сентября 2008

Вкратце: "неопределенное поведение".

(Теперь, что это может включать в себя и почему это так, как уже говорили другие. Мне просто стоило упоминать термин здесь, поскольку он встречается довольно часто).

1 голос
/ 25 сентября 2008

Это может привести к сбою вашей программы, повреждению памяти или другим, более тонким негативным эффектам После удаления памяти рекомендуется установить значение NULL (0). Попытка освободить нулевой указатель ничего не делает и гарантированно безопасна. То же самое относится и к удалению в C ++.

0 голосов
/ 26 августа 2010

Еще одна интересная ситуация:

char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
char * yourString = myString;

if (myString)
{
    free(myString);
    myString = NULL;
}
// Now this one is safe, because we keep to the rule for 
// setting pointers to NULL after deletion ...
if (myString)
{
    free(myString);
    myString = NULL;
}

// But what about this one:
if (yourString)
{
    free(yourString);
    yourString = NULL;
}

//?!? :)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...