次のコードでは、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
どうすればいいの?すべてのオブジェクトデータも破棄されると予想していました。