2015-02-21 3 views
0

, если у меня есть что-то вродетаНос и бесплатно в C

struct Node *root; 
struct Node *q; 

root = malloc(sizeof(struct Node)); 
q = root; 
free(q); 

является узел д указывает на освобожденный ?? или я должен был бы пройти root до функции free?

+1

Пожалуйста, обратите внимание, что '' malloc' и free' работают на * зоны памяти *, а не переменных , У вас может быть несколько переменных, содержащих указатель * того же *. Читайте об [aliasing] указателя (http://en.wikipedia.org/wiki/Pointer_aliasing) –

+0

Я знаю о сглаживании указателей, просто не знаю, как бесплатные работы –

+0

говорят, что бесплатные работы в зонах памяти очищаются, хотя. thanx –

ответ

3

Оба root и q имеют одинаковое значение, то есть они указывают на то же место в памяти. После вызова free(q), оба из них являются оборванными указателями, потому что вещь, на которую они указывают, была освобождена, но они все еще указывают на это местоположение.

Для отмены ссылки будет вызываться неопределенное поведение. Сюда входит вызов free на любом из них.

1

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

+1

В некоторых реализациях (и особенно больших блоках памяти) 'free' иногда может выпускать память, возвращая ее в операционную систему (например, с помощью' munmap' в Linux или POSIX). Но обычно 'free' просто делает зону памяти повторно используемой для будущего' malloc' –

0

После free звоните как q, так и root указывает на освобожденный блок памяти.

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

1

Указатели q и root указывают на тот же блок памяти после назначения. Таким образом, вызов free освободит этот блок, и оба q и root останутся свисающими.

Вы можете написать

free(q); 

или

free(root); 

взаимозаменяемы, так как

q == root 
Смежные вопросы