C++ 将共享指针存储在lambda中以使其保持活动状态
这样的结构旨在存储在lambda中:C++ 将共享指针存储在lambda中以使其保持活动状态,c++,c++11,lambda,shared-ptr,functor,C++,C++11,Lambda,Shared Ptr,Functor,这样的结构旨在存储在lambda中: struct MyStruct { void testfunction() { // Do something } }; 我想从中构造一个共享指针,并将该指针存储在lambda中: auto ptr = std::make_shared<MyStruct>(); std::function<void()> caller = [ptr](){ ptr->testFunction(); } auto ptr=
struct MyStruct {
void testfunction() {
// Do something
}
};
我想从中构造一个共享指针,并将该指针存储在lambda中:
auto ptr = std::make_shared<MyStruct>();
std::function<void()> caller = [ptr](){
ptr->testFunction();
}
auto ptr=std::make_shared();
std::函数调用方=[ptr](){
ptr->testFunction();
}
调用方对象被赋予一个函数,并由该函数复制。ptr
对象超出范围。当我传递调用者对象时,共享指针是否仍然有效
只要调用方存在或返回,是否保证ptr
存储在lambda中,并且对象由该指针管理?如果我不调用testFunction
,是否有任何编译器优化
这个问题特定于一个boost::asio
问题,我想用异步处理程序传递某个对象 来自
如果lambda表达式通过复制捕获任何内容(隐式使用capture子句[=]
,或显式使用不包含字符的捕获,例如[a,b,c]
),则闭包类型包括未命名的非静态数据成员,按未指定的顺序声明,保存如此捕获的所有实体的副本
因此,根据,预期编译器将生成代码,其行为类似于您确实拥有此副本,因此对象将保持活动状态。是的,它将保持活动状态(您可以通过将日志添加到ctors/dtor来检查)。由于不涉及UB,优化器不会破坏这段代码。lambda捕获并使用
ptr
的副本。没有一个优化器可以处理这个问题。无论如何,如果不是一个有缺陷的优化器,@HolyBlackCat+1。它的reference\u count
也像预期的那样得到了处理?你的意思是use\u count()
?是的,为什么不呢。