Это двойной бесплатно в C? - PullRequest
       4

Это двойной бесплатно в C?

4 голосов
/ 02 августа 2010

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

char *ptr;
ptr=malloc(5 * sizeof(*ptr));
free(ptr);
free(ptr);

Приведенный выше код считается двойным свободным.Следующее также считается двойным бесплатным?

char *ptr;
char *ptr1;
ptr=malloc(5 * sizeof(*ptr));
ptr1=ptr;
free(ptr);
free(ptr1);

Спасибо.

Ответы [ 5 ]

10 голосов
/ 02 августа 2010

Да.Библиотека не заботится о том, какое имя вы дали varaible в исходном коде (к моменту выполнения кода оно давно прошло).Все, что имеет значение, это значение, и в этом случае значения, переданные в free(), будут одинаковыми.

10 голосов
/ 02 августа 2010

Да.Вы освобождаете одну и ту же память дважды.

0 голосов
/ 02 августа 2010

Да, это двойное бесплатное (и очень плохая вещь). Ptr1 - это указатель на память, выделенную malloc. Это то же место, на которое указывал ptr. Освобождая ptr и ptr1, вы освобождаете одну и ту же память дважды.

0 голосов
/ 02 августа 2010

Да, так как указатели указывают на один и тот же адрес и поэтому передают один и тот же адрес бесплатно.

Вы можете показать значение указателя, напечатав его

printf( "%p", ptr);

или посмотрите на это в отладчике

0 голосов
/ 02 августа 2010

Да.Двойное освобождение - это когда вы пытаетесь освободить блок памяти, который уже был освобожден.И ptr, и ptr1 указывают на один и тот же блок памяти, поэтому второй вызов free пытается освободить уже освобожденный блок памяти.

...