c++ - Lambda 捕获 'this' 保存为 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(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();
}

最佳答案

发生段错误是因为 Process::processFunc 引用的 std::function 对象在 Foo 构造函数返回时被销毁。要解决此问题,请使 Process 保留 std::function 对象的拷贝。

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

关于c++ - Lambda 捕获 'this' 保存为 std::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48716287/

相关文章:

c++ - 什么时候数据类型对编译器的意义大于其存储空间?

c++ - 使用 C++ 特化模板时的奇怪行为

c++ - QDomDocument : setContent() return false

c++ - 模板和访问者模式

java - 为什么 java lambda 表达式不引入新级别的作用域?

lambda - 对理解 lambda 和接收器感到困惑

C++ 模板/ostream 运算符问题

c++ - 如何将位置 n 的 QList 拆分为新的 QList

c++ - 在 C++ 中使用错误代码的更好方法是什么?

asp.net - 在 ASP.NET 中从数据库自动生成 ID