C++11 当我将函子传递给线程时,将调用析构函数

C++11 当我将函子传递给线程时,将调用析构函数,c++11,C++11,我必须使用functor Runner在c++11中运行线程 class Runner { public: Runner(int){create toData on heap;} ~Runner(){delete toData;} void operator()()const{ loop(); } private: pointer* toData; }; 当我试着像线程一样运行时 Runner temp(1); thread(temp); 或 析构函数被调用并删除数据并得到分段

我必须使用functor Runner在c++11中运行线程

class Runner {
public:
Runner(int){create toData on heap;}
~Runner(){delete toData;}

void operator()()const{
 loop();

}


private:

pointer* toData;

};
当我试着像线程一样运行时

Runner temp(1);
thread(temp);

析构函数被调用并删除数据并得到分段错误。
如何避免这种情况?

您是否编写了正确的复制或移动复制构造函数和运算符?

您是否编写了正确的复制或移动复制构造函数和运算符?

线程的原型是什么?可能您正在使用参数传递值调用线程,它复制没有复制构造函数的对象,如果您使用std::move调用它,并且没有定义move构造函数,并且在线程结束时它会销毁复制的构造函数并使指针无效,则可能也是这样。然后,当程序结束时,它再次调用析构函数,但指针已经失效。正如@PaolaJ所说的,发布线程原型。线程的原型是什么?可能您正在使用通过值传递的参数调用thread,它复制没有复制构造函数的对象,如果您使用std::move调用它,并且您没有定义移动构造函数,则很可能是相同的,在线程结束时,它会销毁复制的线程并使指针无效。然后,当程序结束时,它再次调用析构函数,但指针已经失效。正如@PaolaJ所说,发布线程原型。是的,这可能就是为什么这么多人在他们的类中存储原始指针的原因@RichardHodges要存储什么,我没有很多C++的经验。查阅UNIQuYYPTR、AutoTypTR和SyrdYPPTR文档。做谷歌搜索。也可以阅读赫伯·萨特、安德烈·亚历山德雷斯库或比亚恩·斯特劳斯特鲁普的任何一本书。做好准备。学习C++要花2年的时间,但是这些人会给你指明正确的方向。这可能是为什么很多人在他们的课堂上储存原始指针的原因?RichardHodges要存储什么,我没有很多C++的经验。查阅UNIQuYYPTR、AutoTypTR和SyrdYPPTR文档。做谷歌搜索。也可以阅读赫伯·萨特、安德烈·亚历山德雷斯库或比亚恩·斯特劳斯特鲁普的任何一本书。做好准备。要用2年的时间学习如何流利地使用C++,但这些人会给你指明正确的方向。
thread(move(temp));