Как указатели, присвоенные указателям и free (), работают вместе? - PullRequest
6 голосов
/ 13 октября 2019

Зачем освобождать указатель, скажем, p, который назначается тому, на что указывает другой указатель q, а также освобождать q?

//for example,
int *p = malloc(sizeof(int));
*p = 10;
int *q = malloc(sizeof(int));
q = p;
free(p);
//This frees q as well.

Указатели q и p имеют разные адреса, но указывают только на одно и то же местоположение(т.е. сказать, что они хранят один и тот же адрес, который имеет 10. Исправьте меня, если я ошибаюсь там).

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

Я хотел бы знать, почему это так. (Мне известно о публикации Освободить назначенный указатель , но он не объясняет, почему и как именно это происходит)

Ответы [ 2 ]

6 голосов
/ 13 октября 2019

После

int *p = malloc(sizeof(int));
              x
            +----+
p --------> |    |
            +----+

P указывает на некоторую x память, которая содержит некоторые ненужные данные.

*p = 10;

Вы помещаете 10 в x

              x
            +----+
p --------> | 10 |
            +----+

С ниже

int *q = malloc(sizeof(int));
              y
            +----+
q ------->  |    |
            +----+

Вы создали еще одну память y, на которую указывает q.

При назначении

q = p;
              x
            +----+
p --------> | 10 |
q --------> +----+

              y
            +----+
Memory leak |    |
            +----+

Вы также сделали q для указания x памяти, потеряв единственную ссылку на y память.

С освобождением p

free(p);



p -------->  (invalidated)
q --------> 

              y
            +----+
Memory leak |    |
            +----+

Вы удалилиx память, таким образом, p и q указывают на освобожденную память.

3 голосов
/ 13 октября 2019

Возможно, это поможет:

Вы не освобождаете p или q сами . Вы освобождаете блок памяти , на который они указывают .

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

...