在仍有引用时调用析构函数

时间:2014-05-29 09:46:45

标签: c++

从早期的精彩帖子(例如What are the differences between a pointer variable and a reference variable in C++?)中,我了解到引用可以延长临时对象的寿命。所以,我决定自己尝试一下并获得一个非常意外的(对我而言)结果。这是代码:

#include <iostream>
using namespace std;

class B {
public:
  B() {cout << "Constructor of B" << endl;}
  ~B() {cout << "Destructor of B" << endl;}
  void methodB(){cout << "B is alive!" << endl;}
};

class A {
public: 
  A() {cout << "Constructor of A" << endl;}
  ~A() {cout << "Destructor of A" << endl;}
  B &methodA() {
    cout << "Entering methodA()" << endl;
    B b;
    B &a = b;
    cout << "Exiting methodA()" << endl;
    return a;
  }
};

int main() {
  A a;
  B &b = a.methodA();
  cout << "After the call to methodA()" << endl;
  b.methodB();
  return 0;
}

我希望在main()完成时销毁B类的对象。但是,这是我得到的输出:

Constructor of A
Entering methodA()
Constructor of B
Exiting methodA()
Destructor of B
After the call to methodA()
B is alive!
Destructor of A

注意在执行B的析构函数之后如何执行对methodB()的调用。这种行为有什么解释?

1 个答案:

答案 0 :(得分:1)

  

我了解到引用可以延长临时对象的使用寿命

代码中没有对临时对象的引用。返回对从A::methodA()返回后销毁的局部变量的引用。 &#34; B还活着!&#34;打印只是因为您没有在B中引用任何B::methodB()成员变量。这是无效的,但它可能(或可能不)起作用。

调用b.methodB()基本上是调用一个隐式隐藏的第一个类型B* const和值&b的函数。在你的情况下,b对象已经被销毁(你看到了析构函数被执行),&b指向堆栈上存放对象时的一些内存,但是因为你没有引用任何B的成员,这个指针永远不会被解除引用,这是有效的(尽管你不应该依赖于此)。