2012-05-04 5 views
0

は、このようなコードの部分を検討:boost :: optional <>はどのようにローカル変数を扱うのですか?

struct B { 
    int c; 
    B() { 
     c = 20; 
    } 
}; 
struct A { 
    boost::optional<B> m_b; 
    void f() { 
     B b; 
     this->m_b = b; 
    } 
}; 

int main(void) { 
    A a; 
    a.f(); 
    cout << a.m_b->c << endl; 
} 

どうやら、a.m_bは依然として正当m_bローカル変数bを割り当てた後、存在します。

私はオブジェクトをboost::optional<>に割り当てることは、オブジェクトを指し示すアドレスを割り当てていると思っていたので、この種のことはわかりません。私の例ではオブジェクトはローカル変数であるbなので、そのアドレスは関数f()が終了すると無効になるはずです。

なぜa.m_bはまだ生きていますか?無効なアドレスを指しているはずです。

答えて

2

boost::optionaloperator=は、Bのコピーコンストラクタを呼び出します。あなたにこれを挿入した場合struct Bあなたは何が起こっているかを確認するために、それにブレークポイントを設定することができます。

B(B const& other) 
{ 
} 

ブーストは、その実装に新しい配置を使用して、多分これはあなたを混乱させる何ですか?

+0

わかりました。それがコピーを作ることを知らなかった。ありがとう! – CodeNoob

関連する問題