次のコードがあります。
#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 の所有権を主張し、ラムダでその unique_ptr を使用すると、セグメンテーション違反が発生するようです。この特定のケースでセグメンテーション違反が発生するのはなぜですか? 所有権が譲渡されたラムダでunique_ptrを使用する方法はありますか?
どうもありがとうございました!