在将已删除的指针分配给新对象时调用析构函数

Destructor getting called on assigning the deleted pointer to a new object

本文关键字:对象 析构函数 调用 新对象 删除 分配 指针      更新时间:2023-10-16
    #include <iostream>
    #include <cstdlib>
    #include <string.h>
    using namespace std;
    class A {
            public:
            A () {cout<<" An";}
            virtual ~A () {cout<<" ~An";}
            };
    class B : public A {
            public:
            B () :A() {cout<<" Bn";}
            virtual ~B() {cout<<" ~Bn";}
            };
    int main (int, char *[]) {
            A *ap = new B;
            delete ap;
            A b = *ap;
            return 0;
            }

输出为 :

  A
  B
 ~B
 ~A

为什么 A 的最后一个析构函数被调用为 A b = *ap为什么不在这里调用 A 的构造函数?

谢谢!!!

您遇到了未定义的行为任何事情都可能发生。

调用delete ap;后,取消引用它是非法的:

delete ap;
A b = *ap;

除此之外,您确实知道析构函数是按继承的相反顺序调用的,对吧?这意味着如果删除B,基类析构函数~A也会被调用。

另请注意,如果它是有效的(它不是),A b = *ap;将调用编译器生成的复制构造函数,而不是您的构造函数。