gpt4 book ai didi

c++ - 超出范围后在 Lambda 中设置共享指针

转载 作者:行者123 更新时间:2023-11-30 01:38:24 24 4
gpt4 key购买 nike

我在共享指针、lambda 和作用域方面遇到问题。

我的情况是我有一个我调用的方法,所以我可以稍后使用返回值。到这里为止还算正常。当我在这个方法中有一个异步方法时,问题就来了,我必须为 shared_pointer 设置一组异常。我正在使用 lambda 函数来处理来自此异步方法的回调。在这个 lambda 中,我必须使用我的 shared_pointer 并在其上设置一个异常(来自其类的方法)resultPtr->setException();

我首先在 lambda 中使用了 shared_ptr,然后是 weak_ptr(因为我在某些地方读到 shared_ptr 可能导致内存泄漏)。但直到现在我想我真的需要使用 shared_ptr。

我必须测试是否在第二个 .cpp 中设置了此异常,因此我调用该方法并使用返回值。我让线程等待大约 500 毫秒,然后我测试它是否有异常,但它没有。但是,在极少数情况下,它会出现“hasException”。我可以看到正在调用 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 秒,但它永远不会改变状态(因为它不能指向已销毁的对象)

有没有办法克服这个问题?其他建议?

谢谢!

最佳答案

当然你不能再访问这个对象了,因为它是destroyedshared pointer离开 if(args) block 的范围,即创建它的地方。您需要让对象存在于方法之外,例如。 G。将其存储为类成员或( 禁止!)在全局变量中。

是否需要将其包装在共享指针中尚不清楚,您需要提供 MCVE 以及对 what you want to achieve 的更清晰描述。 .

关于c++ - 超出范围后在 Lambda 中设置共享指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47908488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com