0

次のコードがあります。

#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を使用する方法はありますか?

どうもありがとうございました!

4

1 に答える 1