析构函数的问题在C ++类中调用两次,具有“has-a”关系

时间:2015-06-04 10:46:55

标签: c++ destructor

我有一个A类,它包含另一个B类的对象。这是一个私有对象。但是,当我尝试使用A的对象访问B的成员变量时,不知何故B的析构函数被调用。 无法理解为什么在这里调用B的析构函数?

以下代码的输出为:

In B ctor
In A ctor
10
In B dtor     <------ Why this ?
In A dtor
In B dtor

代码示例:

#include "stdafx.h"
#include <iostream>
using namespace std;

    //Implementaion of B class
    class B
    {
    public:
        int bVal1;
        B::B(void)
        {
            cout << "In B ctor" << endl;
            bVal1 = 10;
        }
        B::~B(void)
        {
            cout << "In B dtor" << endl;
        }
    };

    //Implementaion of A class having private B's object ( composition )
    class A
    {
    private:
        B b;
    public:
        A::A(void)
        {
            cout << "In A ctor" << endl;
        }
        A::~A(void)
        {
            cout << "In A dtor" << endl;
        }
        B A::func2(void)
        {
            return b;

        }
    };

    int _tmain(int argc, _TCHAR* argv[])
    {
        A a;                                //ctor calling order : B followed by A
        cout << a.func2().bVal1 << endl;    //Why ADDITIONAL B's destructor is getting called here ???
        return 0;                           //dtor calling order : A followed by B
    }

我为这段长代码道歉。

1 个答案:

答案 0 :(得分:3)

你运作

B A::func2(void)
{
    return b;

}

返回B类型的对象的副本。所以你在main()函数中有一个临时的本地版本。因此,A::b对象和临时B对象都被销毁,因此您有2次调用B::~B()

你的main()函数等同于:

int _tmain(int argc, _TCHAR* argv[])
{
    A a;                                //ctor calling order : B followed by A
    B b = a.func2();
    cout << b.bVal1 << endl;    //Why ADDITIONAL B's destructor is getting called here ???
    return 0;                           //dtor calling order : b, followed by A::b followed by followed by a
}

尝试这样写:

const B& A::func2(void)
{
    return b;
}

这只会给您B::~B()的一次通话。