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

Lambda capture 'this' saved as std::function

本文关键字:捕获 function std 另存为 Lambda this      更新时间:2023-10-16

用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();
}

发生分割故障是因为当Foo构造器返回时,Process::processFunc引用的std::function对象被破坏。要解决此问题,请使Process保留std::function对象的副本。

struct Process {
    Process(const std::function<void()>& processFunc) 
        : processFunc(processFunc) {}
    // ...
    std::function<void()> processFunc;
};