删除std :: thread指针会引发异常" libc ++ abi.dylib:终止"

时间:2014-08-20 06:15:13

标签: c++ multithreading c++11 stdthread

在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

1 个答案:

答案 0 :(得分:15)

您创建的主题是joinable,除非您joindetach,否则std::terminate会在destructor时被调用线程对象执行。所以你需要

th->join();
delete th;

std::thread的早期提议隐式detach修改了析构函数中的线程,但是当拥有的线程在创建和join之间抛出异常时,发现这会导致问题{1}}实例。 N2802包含更改提案以及说明性示例。

原始行为是从thread继承的,但它在析构函数中也有deprecated隐式boost::thread


与您的问题无关,但您不太可能需要动态分配线程对象,即使您这样做,也应该将其存储在detach中。