удаление объекта в C++ [дубликат]

120
20 сентября 2019, 08:10

На данный вопрос уже ответили:

  • Нужно ли обнулять указатель после использования оператора delete? 4 ответа

Есть связной список , во время когда удаляется из списка один узел, по идее его надо удалить , поскольку он был создан через new. Я использую оператор delete ,но после этого оператора выводится все так же адрес указателя. Почему???

 class LinkedList{
private:
    class Node{
    public:
        int a;
        Node* next;
        ~Node(){
            delete next;
        }
    };
    Node* head;
    int lenght;
public:
    LinkedList(){
        lenght=0;
        head=nullptr;
    }

    void add(int x) {
        Node* current = new Node;
        current->a = x;
        current->next = nullptr;
        if(head==NULL){
            head=current;
        }else{
            Node *node=head;
            while(node->next!=NULL){
                node=node->next;
            }
            node->next=current;
        }
            lenght++;
    }

    void remove(int index){
        Node *temp=head;
        int count=0;
        while(count<index-1){
            temp=temp->next;
            count++;
            }
        Node *rem=temp->next;
        Node *next=rem->next;
        temp->next=next;
        lenght--;
        delete rem;
        cout<<rem<<endl;
    }
    bool isEmpty(){
        return lenght==0;
    }
    int get(const  int index){
        Node *temp=head;
        int i=0;
        while(i<index){
            temp=temp->next;
            i++;
        }
        return temp->a;
    }
    int *toArray(){
        int arr[lenght];
        Node *temp=head;
        for(int i=0;i<lenght;i++){
            arr[i]=temp->a;
            temp=temp->next;
        }
        return arr;
    }
  int size(){
        return lenght;
    }
};
int main(){
    setlocale(LC_ALL,"rus");
 LinkedList obj;
        obj.add(1);
        obj.add(2);
        obj.add(3);
        obj.add(4);
        obj.add(5);
        obj.remove(2);
for(int i=0;i<obj.size();i++)
     cout<<obj.get(i)<<endl;
    return 0;
}
Answer 1

оператор delete rem; освобождает память, выделенной для обьекта, на который указывает rem. Но в rem, как и раньше, записан этот адрес, только с той разницей, что этот адрес может использоваться для других обьектов. Так как этот указатель создан в функции, он уничтожается сам после выхода из функции, и его значение вы не возвращаете из функции, поэтому несанкцианированный доступ к освобожденной части памяти(уничтоженного обьекта) вы не сможете иметь. Если есть ситуация, что вы где то должны хранить этот указатель, то его перед хранением нужно обнулять, т.е. присвоить ноль(nullptr)

READ ALSO
Прикрепить контроллер к FXML не через сам FXML

Прикрепить контроллер к FXML не через сам FXML

Собственно, есть у меня один FXML, к которому я, в зависимости от ситуации, хочу применять один из двух контроллеров, так что вариант с указанием...

107
Из-за чего появляется исключение?

Из-за чего появляется исключение?

Исключение указывает на эту строку StringuserJsonStroke=getJsonFromServer(Stringformat("%s/%d", urlPath), 0);

109
Как работает InputStream и OutputStream в Java

Как работает InputStream и OutputStream в Java

В Java потоки ввода-вывода InputStream и OutputStream представляют собой концепцию работы с внешним миром, будь то файл на диске, экран монитора, сетевое...

132
JavaFX. TreeView. Данные при нажатие на Элементы

JavaFX. TreeView. Данные при нажатие на Элементы

Начал разбираться с JavaFx и появился вопросВозможно ли сделать так, что при нажатии на элементы TreeView появлялся текст, который привязан к этому...

104