2015-04-24 6 views
0

Привет ребята Мой код:сбой программы при удалении указатель

class aClass 
{ 
public: 
    int data; 
    aClass* pointer=NULL; 

    aClass(int x): data(x) { 
     cout << "calling int constructor\n"; 
    } 

    ~aClass() { 
     delete pointer; 
     cout <<"Index " <<this->data<<" calling destructor\n"; 
    } 
}; 

int main() 
{ 
    aClass ob1(1); 
    ob1.pointer=new aClass(2); // let's say the new object is called ob2 
    ob1.pointer->pointer=new aClass(3);// let's say the new object is called ob3 
    delete ob1.pointer; //destory ob2, which will destory ob3 in sequentially. 
    return 0; 
} 

Я ожидал, что выход будет так:

calling int constructor 
calling int constructor 
calling int constructor 
Index 2 calling destructor 
Index 3 calling destructor //I think when ob2is destoyed ob3 will be destoyed 
          //too, but this is not in the output even though I delete "delete pointer" in 
          //the destructor   
Index 1 calling destructor 

Но программа разбился, я знаю его «удалить указатель «в деструкторе, который разбил программу, но я понятия не имею, почему он разбился и почему ob3 не уничтожен?

ответ

3

При выходе из main, ob1 уничтожается автоматически, поэтому его деструктор называется. Там pointer снова удаляется, что приводит к сбою. Не удаляйте ob1.pointer вручную.

Вот базовый пример, который поможет вам понять, что происходит.

class C 
{ 
public: 
    C* p; 

    C() : p(NULL) 
    {} 

    ~C() 
    { delete p; } 
}; 

int main() 
{ 
    C a; 
    // ... 

    // Lets say a.p == 5 for some reason. 
    delete a.p; 
    // The memory at address 5 is now deleted, but a.p remains unchanged. 
    // a.p is still 5, but accessing it is now illegal. 

    return 0; 
    // Stack cleanup -> a is destroyed. 
    // a´s destructor is called, which attempts to delete its p. 
    // This p is a.p which was deleted earlier. 
    // Remember, a.p is still 5, and now it is deleted in ~C. 
    // -> You deleted the memory at address 5 twice. 
} 
+0

Спасибо за ваш ответ, но я до сих пор не понимаю, выглядит, как я понял некоторые основные части Int основных() { aClass ob1 (1). ob1.pointer = new aClass (2); ob1.pointer-> pointer = new aClass (3); удалить ob1.pointer; // ob1 все еще существует в области здесь ob1.pointer = NULL; // почему эта точка должна быть установлена ​​как NULL, поскольку функция int // еще не закончила return 0; } – whoisit

+0

@whoisit Если вы скажете мне, что именно вы не понимаете, я могу попытаться помочь. Я бы рекомендовал читать деструкторы, области и указатели. –

+0

int main() { aClass ob1 (1); // Этап 1 ob1.pointer = new aClass (2); // Этап 2 ob1.pointer-> pointer = new aClass (3); // // Этап 3 delete ob1.pointer; // Этап 4 return 0; // stage 5 } Из моего понимания, что, когда начинается основное, последовательность выполнения - это этап 1 - этап 5, затем основное завершается и начинает очищать память. Итак, ob1 существует с этапа 1 до стадии 5, как его указатель был удален дважды? – whoisit

Смежные вопросы