【问题标题】:New to Destructors (C++) [duplicate]析构函数新手(C++)[重复]
【发布时间】:2016-05-27 21:23:47
【问题描述】:

我是析构函数的新手,到目前为止,我一直遵循的教程已经很清楚了。调用析构函数时实际发生了什么?为什么我仍然从被破坏的对象中获取值?

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;



}

【问题讨论】:

  • 您不想显式调用析构函数。由于您的对象是在堆栈上分配的,因此当您的函数返回时,将自动调用析构函数。
  • @RJM 并非所有对象都在堆栈上创建,但您的观点仍然有效。
  • 你几乎不应该显式调用析构函数,这里的 box1 和 2 是自动变量,在这种情况下,当作用域离开 bloc 时会调用析构函数。
  • @PW。 s/几乎没有/几乎没有
  • @Marcus Muller - 当然它们并没有全部分配在堆栈上。这就是为什么我通过指出 OP 对象是在堆栈上分配的来限定我的评论的原因。 :-)

标签: c++ destructor


【解决方案1】:

从不显式调用析构函数,除非你非常清楚你需要这样做,因为你自己处理对象的生命周期和分配,这通常不是非常 C++ - 类似的方法。

在 C++ 对象的生命周期结束时(例如,当对象超出范围时)自动调用析构函数。

析构函数的工作是在 C++ 运行时释放与该对象关联的内存之前“清理”。显式调用析构函数并不会“删除”对象——它只是将对象带入某种“僵尸”状态。

作为初学者,概括一下:不要显式调用析构函数。

【讨论】:

  • 好吧,如果你使用placement new,你会明确地调用它。
  • 错了。在某些情况下,您确实会显式调用析构函数。
  • @MarcusMüller,你的预感是正确的。如上所述的化妆品变化不会使它成为一个好的答案,并且已经有一个非常好的副本。我建议移除。
  • 所以,我被困在 SergeyA 非常明智的做法之间,即“最好什么都不说,而不是有问题的问题,如果已经有另一个,好的,对类似问题的回答”和 flatmouse 的“给出一个明确建议不要的答案用自己的脚回答一个初学者的问题可能值得那些真正了解 C++ 的人皱起眉头”。
猜你喜欢
  • 2016-11-26
  • 2016-08-14
  • 2018-10-30
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 2013-06-10
相关资源
最近更新 更多