C++ Lambda捕获&x27;这';另存为std::function
下面的代码是用C++14编译的,但是运行它会导致分段错误。这是由lambda函数捕获(用问号注释)引起的吗?正确的方法是什么?提前谢谢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
#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:我不明白五的规则是如何应用于此的。事实上,我会说这是一个“零规则”的课程,很公平。我看得不够仔细。我以为构装师是复制构装师。太好了!谢谢。