Что произойдет, если вы попытаетесь воспользоваться функцией free() уже освобожденной памяти в c?

StackOverflow https://stackoverflow.com/questions/135474

  •  02-07-2019
  •  | 
  •  

Вопрос

Например:

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

free(myString);
myString = NULL;

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

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

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

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

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

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

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

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

Плохие вещи (ТМ)

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

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

Суммируя:«Неопределенное поведение».

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

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

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

Цикл do- while помогает окружающему коду легче усваивать несколько операторов.напримересли (готово) 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;
}

//?!? :)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top