析构函数的问题

发布于 2022-09-01 16:51:10 字数 485 浏览 22 评论 0

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销毁时调一次,不应该是两次吗

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

早乙女 2022-09-08 16:51:10

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

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

private:
    A &_a;

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文