首页 > 析构函数的问题

析构函数的问题

class A
{
public:
    A()
    {
        ;
    };
    ~A()
    {
        cout<<"~A deconstruct"<<endl;
    }
};

class B:public A
{
public:
    B(A &a):_a(a)
    {
        ;
    };
    ~B()
    {
        cout<<"~B deconstruct"<<endl;
    }
private:
    A _a;
};

int main(){

    A a;
    B b(a);
    return 0;
}

~B deconstruct
~A deconstruct
~A deconstruct
~A deconstruct
请问A的析构函数怎么输出了3次,b销毁时调用一次,a销毁时调一次,不应该是两次吗


因为你在B里面又声明了一个private: A _a; 这也是一个对象,所以你的代码创建了2个a对象,析构了两次,加上B析构时也有一次,共3次。

B(A &a):_a(a)这句代码看,原意可能是想传入a的引用(而不是对象),如果是这样的话, B里的声明应该为:

private:
    A &_a;

这样运行上面的代码,A的析构才是两次。

另外,上面的代码还有一个小问题,A作为一个基类,它的析构函数最好声明为 virtual ~A();以免发生内存泄露。

【热门文章】
【热门文章】