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

Например:

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

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

Ответы [ 14 ]

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

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

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

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

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

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

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

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

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

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

Чтобы предотвратить это, сделайте:

free(myString);
myString = NULL;

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

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

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

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

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

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

3 голосов
/ 28 августа 2011

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

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

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

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

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

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

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

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

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

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