【发布时间】:2021-01-10 22:59:51
【问题描述】:
有人能帮我理解为什么我从代码 sn-p 得到以下结果吗?如果将 lambda 函数更改为至少采用 1 个参数:我得到了两次输出“valid ptr”。这是在我的代码中出现的段错误崩溃中发现的。
Output:
valid ptr
nullptr
#include <iostream>
#include <memory>
#include <boost/asio.hpp>
auto getWrapper(boost::asio::io_context& ioContext)
{
auto sharedPtr = std::make_shared<int>(0);
return ioContext.wrap( [sharedPtr](){
if(sharedPtr == nullptr)
std::cout << "nullptr\n";
else
std::cout << "valid ptr\n";
});
}
int main()
{
boost::asio::io_context ioContext;
auto wrapper = getWrapper(ioContext);
wrapper();
wrapper();
ioContext.run();
}
【问题讨论】:
-
我对@987654323@ 不是很熟悉,但据我了解,这意味着每个操作只执行一次。所以可能 lambda 在第一次执行
wrapper()时被移动到执行程序,并使其在第二次执行时处于空状态。 -
我也想过,如果是这样的话,处理程序的第二次执行不应该导致运行计时器错误,例如std::bad_function_call?我观察到的奇怪的事情是,如果 lambda 函数至少采用一个参数,那么一切似乎都可以正常工作。说'return [sharedPtr](int){ ... }'
-
不一定有运行时检查。他们只是打电话给第二个电话 UB 什么的。无论如何,
wrap方法已被弃用。考虑使用他们在 boosr 文档中建议的替代方案。也许它没有被窃听。 (int版本可能被一层boost::bind包裹,它被移动到执行中——这就是原始 lambda 未被移动的原因。 -
如果对您有帮助,请不要忘记接受答案。
标签: c++ boost segmentation-fault shared-ptr