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