Что происходит, когда вы пытаетесь освободить() уже освобожденную память в c?
Например:
char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);
Есть ли какие-либо неблагоприятные побочные эффекты от этого?
Ответы
Ответ 1
Вот глава и стих.
Если аргумент [к функции free
] не соответствует указателю, ранее возвращенному calloc
, malloc
, или realloc
, или если пространство было освобождено вызовом free
или realloc
, поведение undefined. (ISO 9899: 1999 - Языки программирования - C, раздел 7.20.3.2)
Ответ 2
Одно из ничего: повреждение памяти или ошибка сегментации.
Ответ 3
Да, вы можете получить двойную бесплатную ошибку, которая приведет к сбою вашей программы. Он связан с внутренними структурами данных malloc, чтобы отслеживать выделенную память.
Ответ 4
Резюме ответа:
Да, плохие вещи могут и, вероятно, произойдут.
Чтобы предотвратить это:
free(myString);
myString = NULL;
Обратите внимание, что все ссылки на память должны быть установлены на NULL
, если другие были созданы.
Кроме того, вызов free()
с NULL
не приводит к действию. Для получения дополнительной информации см.: человек бесплатно
Ответ 5
Не так умно. Google для двойной свободной уязвимости. Установите указатель на NULL
после освобождения, чтобы избежать таких ошибок.
Ответ 6
В зависимости от того, в какой системе вы его запускаете, ничего не произойдет, программа выйдет из строя, память будет повреждена или любое другое количество интересных эффектов.
Ответ 7
Всегда устанавливайте указатель на NULL после его освобождения.
Безопасно пытаться освободить нулевой указатель.
Стоит написать собственную бесплатную обертку, чтобы сделать это автоматически.
Ответ 8
Не делай этого. Если освобожденная память перераспределяется на что-то еще между вызовами free
, тогда все будет запутано.
Ответ 9
Плохие вещи (TM)
Действительно, я думаю, что это undefined, поэтому вообще что-нибудь, включая игру "Глобальная термоядерная война" с мэйнфреймом NORAD
Ответ 10
Он (потенциально) делает демоны вылетают из вашего носа.
Ответ 11
Это может привести к сбою вашей программы, повреждению памяти или другим более тонким негативным последствиям. После удаления памяти рекомендуется установить значение NULL (0). Попытка освободить нулевой указатель ничего не делает и гарантированно будет в безопасности. То же самое верно для delete в С++.
Ответ 12
Короче: "Undefined Поведение".
(Теперь, что это может включать и почему это так, о чем другие уже сказали. Я просто хотел бы упомянуть этот термин здесь, как это довольно часто).
Ответ 13
По правде говоря, странный макрос ниже - это полезная замена для удаления нескольких классов уязвимостей безопасности, а также отладки помощи, поскольку доступ к областям free() 'd более вероятен для segfault, а не для размывания памяти. /p >
#define my_free(x) do { free(x); x = NULL; } while (0)
Цикл do-while предназначен для того, чтобы помочь окружающему коду легче усвоить несколько операторов. например if (done) my_free (x);
Ответ 14
Другая интересная ситуация:
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;
}
//?!? :)