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();
}
出现段错误是因为Process::processFunc
所指的std::function
对象在Foo
构造函数returns时被销毁了。要解决此问题,请使 Process
保留 std::function
对象的副本。
struct Process {
Process(const std::function<void()>& processFunc)
: processFunc(processFunc) {}
// ...
std::function<void()> processFunc;
};
以下代码可以用 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
构造函数returns时被销毁了。要解决此问题,请使 Process
保留 std::function
对象的副本。
struct Process {
Process(const std::function<void()>& processFunc)
: processFunc(processFunc) {}
// ...
std::function<void()> processFunc;
};