在以下代码中,getObj()
函数返回对本地对象的引用。这显然是非常糟糕的,因为当函数返回时对象被销毁(ctor 和 dtor 输出强调对象的生命周期)。正如预期的那样,编译器(gcc44)给出了相应的警告。
#include <iostream>
class Blah {
private:
int a_;
public:
Blah(int a) : a_(a) { std::cout << "Constructing...\n"; }
~Blah() { std::cout << "...Destructing\n"; }
void print() { std::cout << a_ << "\n"; }
};
Blah& getObj()
{
Blah blah(3);
return blah; // returning reference to local object
}
int main()
{
Blah& b = getObj();
b.print(); // why does this still output the correct value???
return 0;
}
然而,调用print()
明显被破坏的对象仍然会打印出私有变量的正确值a_
。这是输出:
建设中...
...破坏
3
怎么会这样?我本来希望所有对象数据也会被销毁。