2016-05-27 3 views
-1

Я новичок в деструкторах, и обучающие материалы, которые я посещал, были довольно ясными до этого момента. Что на самом деле происходит при вызове деструктора? Почему я все еще получаю значения от уничтоженного объекта?Новое для деструкторов (C++)

class Box { 

public: 
    Box(double l = 2.0, double b = 2.0, double h = 2.0) { //Constructor 
     cout << "Box Created" << endl; 
     length = l; 
     breadth = b; 
     height = h; 
    } 
    ~Box() { 
     cout << "Box Destroyed" << endl; // Box Destructor 
    } 
     double volume() { 
      return length*breadth*height; 
     } 

private: 
    double height; 
    double breadth; 
    double length; 

}; 
void main() { 

    Box Box1(10, 15, 5); //Constructors used 
    Box Box2(5, 15, 20); 

    cout << "Box1.volume: " << Box1.volume() << endl; 
    cout << "Box2.volume: " << Box2.volume() << endl; 
    Box1.~Box(); //Destructors called 
    Box2.~Box(); 
    cout << "Box1.volume after destruction: " << Box1.volume() << endl; 
    cout << "Box2.volume after destruction: " << Box2.volume() << endl; 



} 
+2

Вы не хотите явно вызывать деструкторы. Поскольку ваши объекты выделены в стеке, деструкторы будут вызваны автоматически, когда ваша функция вернется. – RJM

+0

@RJM Не все объекты создаются в стеке, но ваша точка остается в силе. –

+0

Вы вряд ли когда-либо называете деструктор явно, а box1 & 2 здесь являются автоматическими переменными, в этом случае деструкторы вызываются, когда область выходит из блока. –

ответ

-2

Вы никогда вызов деструктора явно, если вы не очень хорошо знаете что вам нужно, потому что вы обработки время жизни и распределение ваших объектов самостоятельно, которые, как правило, является не очень C++ - подобный подход.

Деструкторы предназначены для вызова автоматически, когда время жизни объектов C++ заканчивается, например, когда объект выходит за пределы области видимости.

Задача деструктора состоит в том, чтобы «очистить» до того, как среда выполнения C++ освободит память, связанную с этим объектом. Вызов деструктора явно не «удаляет» объект - он просто переносит объект в какое-то «состояние зомби».

Как новичок, обобщающий: не называйте деструкторов явно.

+1

Ну, вы бы назвали это явно, если вы использовали [размещение нового] ​​(https://isocpp.org/wiki/faq/dtors#placement-new). – wally

+3

Неверно. Вы явно вызываете деструкторы в определенных сценариях. – SergeyA

+0

См. [Является ли вызов деструктором вручную всегда признаком плохого дизайна?] (Http://stackoverflow.com/questions/14187006/is-calling-destructor-manually-always-a-sign-of-bad-design) – stuartd

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