Указатели как это работает при копировании в другой указатель - PullRequest
0 голосов
/ 01 марта 2019

Привет всем.

#include <bits/stdc++.h> 
    using namespace std; 

    int main() 
    { 

        int* ptr1 = new int; 

        int* ptr2 = ptr1; 

        delete ptr2; // Detroying ptr2 

        return 0; 
    } 

В приведенном выше случае будет освобождена память, используемая ptr1, или будет уничтожен только ptr2.У меня есть еще одно сомнение.У меня есть древовидная структура, в которой узел указывает на двух дочерних элементов (у этих дочерних узлов есть листовые узлы, рассмотрим большое дерево).Если мне нужно удалить одного дочернего элемента корневого узла, нужно ли удалять каждый объект-указатель внуков, внуков и т. Д.?Заранее спасибо?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Эта часть :

new int;

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

#include <iostream>

int main() {
    int* ptr1 = new int;
    int* ptr2 = ptr1;

    // When I ran this the output was: 0x7fe835402a40 0x7fe835402a40
    std::cout << ptr1 << ' ' << ptr2 << std::endl;

    delete ptr1;

    // Output is still: 0x7fe835402a40 0x7fe835402a40
    std::cout << ptr1 << ' ' << ptr2 << std::endl;

    return 0;
}

Что касается вашего второго вопроса, вы не удаляете указатели,Вы удаляете память, на которую они указывают.Если у более поздних узлов есть память, которую вы хотите освободить, тогда да, вам придется рекурсивно удалять их

0 голосов
/ 01 марта 2019

int, на который указывают оба ptr2 и ptr1, будет освобожден.Оператор delete освобождает объект, на который указывает указатель, а не сам указатель.(Указатели остаются после удаления, но теперь они «висячие указатели», указывающие на память, которая больше не используется вами)

Что касается удаления древовидной структуры, да, вам придется удалять рекурсивно, внизк листьям.Как правило, это делается внутри метода-деструктора вашего класса узлов и является довольно простым (просто вызовите delete на каждом из ваших прямых дочерних узлов, что приведет к выполнению их методами-деструкторами и удалению каждого из их дочерних узлов и т. Д.)

...