2014-06-04 3 views
0

Код, приведенный ниже, дает неопределенное поведение, иногда код работает хорошо, но иногда он дает ошибку munmap_chunk.Как вы безопасно освобождаете память?

char *str = "hello world"; 
if(str != NULL) free(str) 

Есть что-то нехорошо, что я делаю в приведенном выше коде?

Также как избежать duplicate free? Как проверить, есть ли у переменной некоторая память прямо сейчас/или еще не была освобождена?

ответ

2

Как правило, строковый литерал («мир привет») будет храниться в разделе данных на странице только для чтения.

Таким образом, вы не можете их освободить.

Также как избежать дублирования бесплатно?

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

if(str != NULL) 
{ 
free(str); 
str = NULL; 
} 
+1

Это ложный хороший совет. Во-первых, 'free (NULL)' является законным и действительным, во-вторых, вы просто * скрываете * двойную свободную. Программа, которая опирается на такой фрагмент кода, нарушает логику. –

+0

Программа, которая опирается на такой фрагмент кода, сломала логику. ..? Я не понимаю этого. Пожалуйста, объясни? –

+4

Если вы попали в программу, в которой вы не знаете, сколько раз был освобожден фрагмент памяти (например, в вашем случае), ваша логика неверна. Память должна быть освобождена * ровно один раз *. Установка указателя на 'NULL' для предотвращения освобождения памяти * снова * является проблемой проектирования. –

2

Эта строка не выделена malloc(), поэтому ее не следует освобождать с помощью free(). Строковые литералы выделяются статически в исполняемом файле, а не динамически во время выполнения.

+0

Я вижу. А как насчет ответа на мой второй вопрос? Как избежать дублирования бесплатно? – Ninja420

+0

Чтобы избежать вызова free() снова ... после каждого указателя маски(), как NULL, чтобы вы больше не захотели их освобождать ... я объяснил в своем ответе –

0

char *str = "hello world"; if(str != NULL) free(str);

Это неправильно, *str не malloced. и «hello world» хранится в памяти только для чтения, вы не можете его освободить

Смежные вопросы