2011-09-02 19 views
-1

、1私は、次のテストコードで2つのクラスを置く奇妙な行動は、私は2つのクラスを持っている

class OKClass 
{ 
public: 
    void PrintTest() { 
     std::cout << "print from OK class " << std::endl; 
    } 
}; 

class CrashClass 
{ 
public: 
    virtual void PrintTest() { 
     std::cout << "print from virtual Crash class " << std::endl; 
    } 
}; 

仮想関数を持つ CrashClassは )(ときコールfuncをクラッシュOkClassは「OKクラスからの印刷」という単語を印刷します。スコープ外でshared_ptrテストがリリースされたためです。 なぜこの奇妙なことが起こるか私に説明できますか?

は、情報

typedef boost::weaked_ptr<CrashClass> wptr 

の短いために、私は最初のクラスが動作する理由を知っている必要があり、第二は

をクラッシュし、私が持っている

boost::function0<void> func; 
{ 
    boost::shared_ptr<CrashClass> test(new CrashClass); 
    func = boost::bind(&CrashClass::PrintTest, boost::bind(&CrashClass::wptr::lock, CrashClass::wptr(test))); 
} 
func(); 

SRYありがとうこの問題を回避するためにFunctorを使用する

ありがとうとにかく

+10

コードよりもはるかに多くのコードを貼り付ける必要があります。例えば ​​'wptr'は何ですか? –

+0

Chris Jester-Youngが指摘しているように、コードが見当たらないので、wptrの内容はわかりません。しかし、関数オブジェクトをPrintTestの最初の引数にバインドしていますが、PrintTestはメンバメソッドであり、最初の引数がクラスのインスタンスにバインドされている必要があります。 wptr :: lockがインスタンスを返す関数である場合、これを動作させるにはもっと多くの作業が必要ですが、その時点では推測に過ぎず、実際には答えではありません。 – ex0du5

+0

未登録のアカウントをマージしました。質問をもう一度編集し、受け取った回答の下にコメントを残すことができます。 –

答えて

0

wptrがわからないと、テストが範囲外になったときにCrashClassのインスタンスが削除されていることがわかります。この場合、クラッシュを防止するために中括弧を取り除くことができます。 「遅れ」はおそらく「防止する」よりも正確です。

0

boost::weak_ptr保証それが指すメモリがくっつくでしょう。それはクラスの全体のポイントです。 weak_ptrの所有者は、それを呼び出す前にポインタ(shared_ptr)とテストをロックする必要があります。それ以外の場合は、weak_ptrが間違っています。

関連する問題