Как освободить указатель без освобождения содержимого?Вспомогательная переменная - PullRequest
1 голос
/ 18 мая 2019

Я все больше и больше пытаюсь бороться с утечками памяти, пытаясь выучить этот язык .. Программа, над которой я работаю, представляет собой дерево двоичного поиска, корень дерева всегда находится в tree->root->l. Теперь, если я сделаю это ...

BSTNode *search(BSTree *tree ,Item elem)
{
    BSTNode* aux;
    aux = tree->root->l;

    /*
    *    BSTNode not found.
    *
    */    
    if(notFound)
    {
         free(aux);
         free(found)
         return NULL;
    }
 // . . . . . .
}

это также отнимет tree->root->l? как мне избежать этого, если так?

Ответы [ 2 ]

2 голосов
/ 18 мая 2019

Да, tree->root->l будет освобожден, потому что aux указывает на ту же память. У вас есть два указателя, указывающие на одну и ту же область памяти. Передача любого указателя на free() освободит память, на которую они оба указывают.

Вы избегаете этого, не передавая указатель free, указывающий на область памяти, которую вы не хотите освобождать.

Звучит так, будто вы спрашиваете, как использовать aux, чтобы указывать на что-то еще, не освобождая tree->root->l. Для этого вы можете просто переназначить aux:

aux = some_other_pointer;

Нет необходимости освобождать что-либо, пока вы сохраняете указатель где-то , который все еще указывает на память, которую вам нужно будет освободить позже.

Из ваших комментариев: «У меня была идея, что вам нужно освободить все переменные, когда вы закончите с ними». Это почти правильно. Вы должны освободить всю динамически выделенную память. Вам не нужно пытаться освободить то, что не было выделено, с помощью звонка на malloc, поэтому нет необходимости звонить free на aux. Вам нужно будет вызвать free для каждого элемента в двоичном дереве в какой-то момент, но у вас все еще есть указатель root, чтобы отслеживать все это, и вы можете очистить его в конце программы или когда вы больше не будете нужно дерево.

2 голосов
/ 18 мая 2019

Сам указатель находится в автоматическом хранилище, что означает, что вам не нужно беспокоиться о его распределении или освобождении.Поэтому вам нужно беспокоиться не о указателе , а о памяти , адресуемой указателем.Здесь free вступает в игру.free не освобождает указатель, но память, к которой обращается указатель.

будет также освобождать tree->root->l?

Он освободит память, на которую указывают и aux, и tree->root->l.

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

как мне избежать этого, если так?

Удалить free(aux);.

Означает ли это, что еслиЯ оставляю такие переменные, чтобы это не вызывало утечку памяти или ненужное использование ресурсов?

Правильно.Вопрос, который вам нужно задать себе: «Адрес памяти, к которому обращается этот указатель, все еще используется?»Если ответ да, не освобождай его.Если ответ отрицательный, освободите его.

...