Когда я должен освободить двойной указатель? - PullRequest
0 голосов
/ 31 мая 2018

У меня проблемы с пониманием, когда освободить указатель на указатель.Для массивов я понимаю, что что-то вроде:

char **mat = (char**) malloc(sizeof(char*) * 100);

for(int i = 0; i < 500; i++)
    mat[i] = (char*) malloc(sizeof(char) * 50);

потребует

  1. освобождения каждого i-го члена переменной mat с последующим окончательным свободным вызовомдо корня (коврик **).Это интуитивно понятно, потому что каждый malloc получает бесплатно.

Однако, когда я делаю что-то вроде этого:

char *str = (char *) malloc(100 * sizeof(char));
char **pstr = &str;

free(pstr);

Я обнаруживаю, что это говорит мне, что я пытаюсь освободитьневерный указательМоя логика заключается в том, что pstr является указателем на указатель на массив символов malloc - освобождение pstr должно освободить str.Вместо этого я получаю неверный указатель.Что дает?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Выделенная память указана *pstr, поэтому вам нужно free(*pstr).

0 голосов
/ 31 мая 2018
char *str = (char *) malloc(100 * sizeof(char));
char **pstr = &str;

free(pstr); //WRONG

Это неправильно.pstr - это адрес некоторой автоматической переменной (поэтому, скорее всего, он будет находиться в стеке вызовов , а не в куче).Он не был получен malloc, поэтому free -ing запрещен ( неопределенное поведение , т. Е. UB).Будьте напуганы UB.

Указатели значения .Вы можете только free указатель (фактически блок памяти, на который он указывает), который был ранее получен (возможно косвенно) с помощью malloc или calloc (и они могут потерпеть неудачу: вы забыли обработать ошибку * 1023)*).

Подумайте над определением некоторого Matrix абстрактного типа данных .См. Также this .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...