C++ Lambda捕获&x27;这';另存为std::function

C++ Lambda捕获&x27;这';另存为std::function,c++,c++11,lambda,std-function,C++,C++11,Lambda,Std Function,下面的代码是用C++14编译的,但是运行它会导致分段错误。这是由lambda函数捕获(用问号注释)引起的吗?正确的方法是什么?提前谢谢 #include <functional> #include <iostream> #include <memory> struct Process { Process(std::function<void()> &processFunc) : processFunc(proce

下面的代码是用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();
}
#包括
#包括
#包括
结构过程{
进程(std::function和processFunc)
:processFunc(processFunc){}
void doit(){
processFunc();//导致分段错误
}
std::function&processFunc;
};
结构Foo{
Foo(){
std::function func=[this](){this->process();};/?
p=std::使_唯一(func);
}
void进程(){std::cout doit();}
std::唯一的ptr p;
};
int main()
{
富富,;
foo.start();
}

分段错误发生的原因是
std::function
对象在
Foo
构造函数返回时被销毁。要解决此问题,请使
Process
保留
std::function
对象的副本

struct Process {
    Process(const std::function<void()>& processFunc) 
        : processFunc(processFunc) {}
    // ...
    std::function<void()> processFunc;
};
struct进程{
进程(const std::function和processFunc)
:processFunc(processFunc){}
// ...
std::函数processFunc;
};

分段错误发生的原因是
std::function
对象在
Foo
构造函数返回时被销毁。要解决此问题,请使
Process
保留
std::function
对象的副本

struct Process {
    Process(const std::function<void()>& processFunc) 
        : processFunc(processFunc) {}
    // ...
    std::function<void()> processFunc;
};
struct进程{
进程(const std::function和processFunc)
:processFunc(processFunc){}
// ...
std::函数processFunc;
};

< A/NaveBurbar YESWELL,你可能会想补充一下,这是由一个悬而未决的引用在你的答案中引起的,只是为了完整性。“我不明白五的规则是如何应用于这里的。事实上,我会说这是一个“零规则”的课程,很公平。我看得不够仔细。我以为构装师是复制构装师。太好了!非常感谢。“阿纳博博拉亚耶斯韦尔,你可能想考虑一下,这是由你的答案中悬而未决的引用引起的,只是为了完整性。”JaveDaords:我不明白五的规则是如何应用于此的。事实上,我会说这是一个“零规则”的课程,很公平。我看得不够仔细。我以为构装师是复制构装师。太好了!谢谢。