调用析构函数将已删除的指针指定给新对象

时间:2012-06-12 09:23:29

标签: c++

    #include <iostream>
    #include <cstdlib>
    #include <string.h>

    using namespace std;

    class A {
            public:
            A () {cout<<" A\n";}
            virtual ~A () {cout<<" ~A\n";}
            };

    class B : public A {
            public:
            B () :A() {cout<<" B\n";}
            virtual ~B() {cout<<" ~B\n";}
            };

    int main (int, char *[]) {
            A *ap = new B;
            delete ap;
            A b = *ap;
            return 0;
            }

输出是:

  A

  B

 ~B

 ~A

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

谢谢!!!

1 个答案:

答案 0 :(得分:5)

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

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

delete ap;
A b = *ap;

除此之外,你知道析构函数是以相反的继承顺序调用的,对吧?这意味着如果删除B,也将调用基类析构函数~A

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