Lambda 捕获'this'另存为 std::function
Lambda capture 'this' saved as 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();
}
发生分割故障是因为当Foo
构造器返回时,Process::processFunc
引用的std::function
对象被破坏。要解决此问题,请使Process
保留std::function
对象的副本。
struct Process {
Process(const std::function<void()>& processFunc)
: processFunc(processFunc) {}
// ...
std::function<void()> processFunc;
};
相关文章:
- "error: no matching function for call to"构造函数错误
- 调用专用模板时出错"no matching function for call to [...]"
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 当类定义不可见时捕获异常
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- Confusion: decltype vs std::function
- 为什么 std::function 可以作为 std::not2 的参数?
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 在 lambda 捕获中声明的变量的类型推导
- 传递给std::function template的template参数究竟代表什么
- RtlCaptureStackBackTrace未捕获任何帧
- 如果 std::function 捕获了unique_ptr,如何复制它?
- 使用 std::function 作为成员函数,它捕获"this",并在析构函数之后从复制的 lam
- Lambda 捕获'this'另存为 std::function
- 如果我使用 std::function 来捕获 lambda,我应该担心它被解除分配吗?
- 为什么隐式"lambda to function pointer conversion"禁止"by reference"捕获静态成员?
- 带有 std::function 的通用 lambda 不会捕获变量
- C++类型擦除,请使用 std::function 捕获单个类的多个方法
- 将存储在std::function中的带有捕获子句的lambda转换为原始函数指针