我有以下代码:
#include <functional>
#include <memory>
#include <string>
#include <iostream>
struct A{
int i = 5;
};
class B{
std::unique_ptr<A> a;
std::function<void (void)> f;
public:
B(std::unique_ptr<A> a)
: a(std::move(a)),
f([&](){
std::cout << a->i << '\n'; //segfaults when executing a->i
})
{}
B()
: a(new A),
f([&](){
std::cout << a->i << '\n'; //works fine
})
{}
void execLambda(){
f();
}
void exec(){
std::cout << a->i << '\n'; //works fine
}
};
int main(){
B b1;
b1.exec(); //works fine
b1.execLambda(); //works fine
B b2(std::unique_ptr<A>(new A));
b2.exec(); //works fine
b2.execLambda(); //will segfault
return 0;
}
似乎当一个对象声明对现有unique_ptr的所有权并在lambda中使用该unique_ptr时,就会发生分段错误。为什么在这种特定情况下会出现分段错误?无论如何在lambda中使用unique_ptr,其中所有权已被转移?
非常感谢!
答案 0 :(得分:1)
不要将成员和方法参数命名为同一个东西。但是,如果您坚持这样做,您应该能够将lambda捕获更改为[this]
而不是[&]
来解决问题。
正如评论者所说:
猜测我会说lambda正在从构造函数中捕获a - 你搬家的那个 - 而不是班里的人。 - 乔纳森·波特