、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を使用する
ありがとうとにかく
コードよりもはるかに多くのコードを貼り付ける必要があります。例えば 'wptr'は何ですか? –
Chris Jester-Youngが指摘しているように、コードが見当たらないので、wptrの内容はわかりません。しかし、関数オブジェクトをPrintTestの最初の引数にバインドしていますが、PrintTestはメンバメソッドであり、最初の引数がクラスのインスタンスにバインドされている必要があります。 wptr :: lockがインスタンスを返す関数である場合、これを動作させるにはもっと多くの作業が必要ですが、その時点では推測に過ぎず、実際には答えではありません。 – ex0du5
未登録のアカウントをマージしました。質問をもう一度編集し、受け取った回答の下にコメントを残すことができます。 –