Подтвердить что ты не робот

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

Например:

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

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

4b9b3361

Ответ 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

Ответ 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;
}

//?!? :)