为什么在声明指向对象的指针时不调用析构函数

Why is the destructor not called when i'm declaring a pointer to an object

我注意到当我在程序结束时声明一个指向对象的指针时,析构函数没有被调用。这是我试过的代码:

class B {
    public:
        B(){cout<<"cons B;";    };
        B(const B &b ){cout<<"copy B;"; };
       ~B(){cout<<"Destr B;";   };

 };

class Y:public B {
public:
    Y(){cout<<"cons Y;";    };
    Y(const Y &y ){cout<<"copy Y;"; };
    ~Y(){cout<<"Destr Y;";  };

};


int main(){
   Y *y= new Y;
   f(y);
}

没有调用析构函数,结果是:cons B cons Y 另一方面,如果我 运行 此代码:

Y y;

析构函数被调用,结果是:cons B cons Y dest Y dest B

我的问题是为什么第一个程序没有调用析构函数?

对象的析构函数在对象被销毁时调用,而不是在程序退出时调用。在您的代码中,您永远不会销毁对象。

您无意中造成了内存泄漏。

使用完对象后或退出应用程序之前销毁对象,将调用其析构函数。

int main(){
   Y *y= new Y;
   f(y);
   delete y;
}

您已经使用 new 运算符在堆中创建了一个 Class 的对象,在堆中,每当我们创建一个对象时,我们有责任删除动态创建的内存。 所以我们需要显式调用delete来释放内存,一旦我们使用delete就会调用析构函数。

如果您从更高级别的语言迁移过来,很容易忘记您没有垃圾收集器。一个经验法则是,无论何时使用 new,完成后使用 delete。即使在函数之后,或者在您的情况下程序结束后,指针也会保持存在。它们的用途是生成一些数据的函数,比方说模型。如果您使用指针,则可以在函数结束并释放其堆栈后继续使用该模型。小心指针并确保它们有时会被删除,它不必在同一个函数中。

指针就像一个保险箱。您可以初始化一个并通过取消引用它并更改其内容来访问它。您还可以将保管箱交给其他人,让他们修改和查看与您所做的相同的内容,而不是只给他们一份其中所有内容的副本。由于其他人也可以使用和编辑其内容,因此在最初创建它的人过世后,该保管箱将保持存在。

析构函数在其class的对象被销毁时被调用,一个对象将在以下情况被销毁:

1- 当此对象是自动对象(auto/register 本地对象或 non-static/non-extern 本地对象)或临时对象超出其声明的范围时。

2-当此对象为外部对象或静态对象且程序终止时。

3- 当此对象是(其 class 的)指向“新”分配的内存并使用“删除”运算符时。

一旦这些对象被销毁,它们 class 的析构函数将被反向调用。