Lambda捕获'this'保存为std :: function

jia*_*anz 0 c++ lambda c++11 std-function

使用C++ 14编译以下代码,但运行它会导致分段错误.这是由lambda函数捕获引起的(用问号标注)?这样做的正确方法是什么?提前致谢.

#include <functional>
#include <iostream>
#include <memory>

struct Process {
    Process(std::function<void()> &processFunc) 
        : processFunc(processFunc) {}
    void doit() {
        processFunc();  // causes segmentation fault
    }

    std::function<void()> &processFunc;
};

struct Foo {
    Foo() {
        std::function<void()> func = [this](){this->process();}; // ?
        p = std::make_unique<Process>(func);
    }
    void process() {std::cout << "Done.\n";}
    void start() {p->doit();}
    std::unique_ptr<Process> p;
};

int main()
{
    Foo foo;
    foo.start();
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 5

发生分段错误是因为引用的std::function对象Process::processFuncFoo构造函数返回时被销毁.要解决此问题,请Process保留std::function对象的副本.

struct Process {
    Process(const std::function<void()>& processFunc) 
        : processFunc(processFunc) {}
    // ...
    std::function<void()> processFunc;
};
Run Code Online (Sandbox Code Playgroud)