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

Для меня я сделал глупую ошибку. Я пишу класс следующим образом:

class A: A {
.......
}

Класс наследует сам, что вызывает замораживание. Нет подсказки сообщения от Xcode.

29
задан lillq 25 September 2008 в 19:32
поделиться

14 ответов

Вот глава и стих.

Если аргумент [функции free] не совпадает с указателем, ранее возвращенным функцией calloc, malloc или realloc, или если пространство было освобождено вызовом free или realloc, поведение не определено. ( ISO 9899: 1999 - Языки программирования - C , раздел 7.20.3.2)

34
ответ дан Chris Conway 25 September 2008 в 19:32
поделиться

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

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

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

1
ответ дан mbac32768 25 September 2008 в 19:32
поделиться

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

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

1
ответ дан Christian.K 25 September 2008 в 19:32
поделиться

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

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;
}

//?!? :)
-1
ответ дан pinpinokio 25 September 2008 в 19:32
поделиться

Плохие вещи (TM)

На самом деле, я думаю, что это неопределенно, так что вообще ничего, включая игру в «Глобальную термоядерную войну» с мэйнфреймом NORAD

2
ответ дан BCS 25 September 2008 в 19:32
поделиться

Не делай этого. Если освободившаяся память будет перераспределена на что-то другое между вызовами free, то все будет испорчено.

2
ответ дан Khoth 25 September 2008 в 19:32
поделиться

В зависимости от того, на какой системе вы его запускаете, ничего не произойдет, произойдет сбой программы, будет повреждена память или появятся другие интересные эффекты.

4
ответ дан John Millikin 25 September 2008 в 19:32
поделиться

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

1
ответ дан luke 25 September 2008 в 19:32
поделиться

Это (потенциально) заставляет демонов вылететь из твоего носа .

3
ответ дан Jens 25 September 2008 в 19:32
поделиться

Не такой умный. Google для двойных бесплатных уязвимостей. Установите указатель на NULL после освобождения, чтобы избежать таких ошибок.

6
ответ дан Armin Ronacher 25 September 2008 в 19:32
поделиться

Да, вы можете получить ошибку двойного освобождения, которая приведет к сбою вашей программы. Это связано с внутренними структурами данных malloc для отслеживания выделенной памяти.

14
ответ дан jbleners 25 September 2008 в 19:32
поделиться

Одно из ничего, тихое повреждение памяти или ошибка сегментации.

18
ответ дан mbac32768 25 September 2008 в 19:32
поделиться

Всегда устанавливайте указатель на NULL после его освобождения. Можно попытаться освободить нулевой указатель.

Стоит написать свою бесплатную оболочку, чтобы сделать это автоматически.

3
ответ дан Jonathan Leffler 25 September 2008 в 19:32
поделиться

Краткое содержание ответа:

Да, плохие вещи могут и, вероятно, произойдут.

Для предотвращения этого сделайте:

free(myString);
myString = NULL;

Обратите внимание, что все ссылки на память должны быть установлены на NULL, если были созданы другие.

Кроме того, вызов free() с NULL не приводит к каким-либо действиям. Для получения дополнительной информации см .: человек свободен

8
ответ дан Jonathan Leffler 25 September 2008 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: