【发布时间】:2018-06-03 03:48:17
【问题描述】:
我遇到了共享指针、lambda 和范围的问题。
我的情况是我有一个我调用的方法,所以我可以稍后使用返回的值。到这里为止有点正常。当我在此方法中有一个异步方法时,问题就来了,我必须对 shared_pointer 进行一组异常。我正在使用 lambda 函数来处理来自此异步方法的回调。在这个 lambda 中,我必须使用我的 shared_pointer 并在其上设置一个异常(来自其类的方法) resultPtr->setException();
我首先使用了 shared_ptr,然后在 lambda 中使用了 weak_ptr(因为我在某些地方读到 shared_ptr 可能导致内存泄漏)。但直到现在我想我真的需要使用 shared_ptr。
我必须测试是否在第二个 .cpp 中设置了此异常,因此我调用该方法并使用返回值。我让线程等待大约 500 毫秒,然后我测试它是否有异常,但它没有。但是,在极少数情况下,它“有异常”。我可以看到正在调用 lambda,并且它通过我的日志设置了异常,但是它似乎并没有改变我首先返回的值(就像它指向不同的地方一样)。
我提到的第一种方法的输入对我的情况并不重要,只是它们是指针。
在我的情况下,我有类似的东西:
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 的对象值。发生的情况是,一旦超出范围(返回 a),我就无法再访问该对象。在我调用这个方法后,我让线程等待了大约 1 秒,但它永远不会改变状态(因为它不能指向被破坏的对象)
有没有办法克服这个问题?其他建议?
谢谢!
【问题讨论】:
-
什么是
stuff? -
“一旦超出范围(返回 a),我就无法再访问该对象了。”这不是真的,所以不清楚你有什么问题。提供minimal reproducible example
-
您的示例在很多方面都令人困惑。将其缩小到与您的问题相关的事情。你有没有类型的“args”,在任何地方都没有使用,“method_name”是一个成员函数,但是没有类,没有类型的“input”......stackoverflow.com/help/mcve如果无法编译是问题“返回一个; ",将其缩小到无法编译的行。
-
@JonathanMee 一些与此场景无关的代码。可能只是一些日志或什么都没有,所以我决定将其保留。
-
@lars 我明白了。实际上,我在这上面花了太多时间,我的大脑本身就很困惑。我试图把我认为不必要的东西抽象化。 args 在这里并不重要,只是为了表明如果 args 是/是 nullptrs,我正在设置一个异常。一切都编译得很好,并且没有崩溃。检查我的编辑,也许它有助于更好地理解我的问题。
标签: c++ lambda scope shared-ptr