共有ポインタ、ラムダ、スコープに問題があります。共有ポインタが範囲外になった後にラムダに設定しました
私の状況は私が呼び出すメソッドがあるため、後で返される値を使用することができます。ここまでの正常な種類。問題は、このメソッドの中に非同期メソッドがあり、shared_pointerへの例外のセットを作成する必要があるときです。私はこの非同期メソッドからコールバックを処理するためにラムダ関数を使用しています。このラムダでは、私はshared_pointerを使用して、その例外(そのクラスのメソッド)をセットする必要があります。resultPtr-> setException();
私はshared_ptrを最初に使用し、次にラムダのweak_ptrを使用しました(なぜなら、shared_ptrがメモリリークを引き起こす可能性がある場所を読み込んでいるからです)。しかし、これまではshared_ptrを使う必要があります。
この例外が2番目の.cppに設定されているかどうかをテストする必要があるため、メソッドを呼び出して戻り値を使用します。私は約500ミリ秒待ってスレッドを入れて、それが例外を持っているかどうかをテストしますが、それはありません。しかし、非常にまれなケースでは、それは "hasException"です。私はラムダが呼び出されていることと、ログを通して例外を設定していることがわかりますが、最初に返された値は変更されないようです(別の場所を指しているようです)。
私が言及した最初の方法の入力は、私の場合は重要ではなく、単にポインタです。テストのために
file1.cpp
typedef shared_ptr<Result> ResultPtr;
ResultPtr method_name(TypePtr args)
{
if(args != nullptr)
{
ResultPtr result = make_shared<Result>();
stuff->callAsync([this, result](input)
{
if(result == nullptr)
{
result->setException();
}
});
}
else
{
result->setError();
}
return result;
}
file2.cpp
bool testingMethod()
{
ResultPtr result = file1::methodName(TypePtr args)
std::this_thread::sleep_for(std::chrono::milliseconds(500));
test(result->hasException);
}
は私が(ここでは重要ではない)特定の入力でこのメソッドを呼び出す別のクラスを使用していると私はresultPtrのオブジェクト値を比較する必要があります。私の場合は
は、私のようなものを持っています。何が起こるのは、スコープから外れるとすぐ(返り値)、私はもうオブジェクトにアクセスすることができないということです。私はこのメソッドを呼び出した後、スレッドを約1秒待機させますが、状態を変更することはありません(破棄されたオブジェクトを指すことはできません)。
これを克服する方法はありますか?その他の提案?
ありがとうございました!
「stuff」とは何ですか? –
"スコープから外れるとすぐ(返り値)、オブジェクトにアクセスできなくなります。これは真実ではないので、あなたがどのような問題を抱えているかは不明です。 [mcve] – Slava
を提供するあなたの例は、多くの点で混乱しています。あなたの問題に関連するものに絞ってください。あなたは型なしでどこでも使用されている "args"を持っていますが、 "method_name"はメンバ関数ですが、型がない "input"クラスはありません.... https://stackoverflow.com/help/mcve Ifコンパイルできないという問題は、 "return a;"で、コンパイルされない行に絞ってください。 – lars