在Mac OS X上使用LLVM 6.0的C ++ 11中,我首先创建了一个指向std :: thread内存分配的指针。
std::thread* th = new std::thread([&] (int tid) {
// do nothing.
}, 0);
然后我试图删除它。
delete th;
但是,编译上面的代码并执行它会引发异常
libc++abi.dylib: terminating
Abort trap: 6
答案 0 :(得分:15)
您创建的主题是joinable
,除非您join
或detach
,否则std::terminate
会在destructor时被调用线程对象执行。所以你需要
th->join();
delete th;
std::thread
的早期提议隐式detach
修改了析构函数中的线程,但是当拥有的线程在创建和join
之间抛出异常时,发现这会导致问题{1}}实例。 N2802包含更改提案以及说明性示例。
原始行为是从thread
继承的,但它在析构函数中也有deprecated隐式boost::thread
。
与您的问题无关,但您不太可能需要动态分配线程对象,即使您这样做,也应该将其存储在detach
中。