为什么boost :: thread可以被删除两次?

时间:2011-09-14 13:12:00

标签: c++ multithreading memory-management boost

我注意到一些奇怪的事情。我希望通过以下代码生成段错误,但事实并非如此。

void DeadlineTimeOut(const boost::system::error_code& pErrorCode, boost::thread* pThread) 
{
    std::cout << "Error code: #" << pErrorCode.value() 
      << " Message: " << pErrorCode.message() << std::endl;
    std::cout << "Thread Address = " 
      << pThread << std::endl; // "sth. like 0x33aabc0"

    pThread->interrupt();
    pThread->join();

    delete pThread;
    delete pThread;

    std::cout << "Stopped execution thread #" 
      << pThread->get_id() << std::endl; // "{Not-any-thread}"
}

那么,为什么双重删除可能?并且还要召集会员?我现在有点困惑。

1 个答案:

答案 0 :(得分:13)

两次删除指针是undefined behaviour。不保证会出现段错误。如果你幸运,你可能会得到一个;你可能不会。代码可能会通过所有测试,然后在最糟糕的时刻在客户面前爆炸。请参阅C++ FAQ

取消引用已删除的指针(代码中的pThread->get_id())也是如此。

一种简单的防御技术是在删除指针后立即将指针设置为NULL,而不是让它们dangle。这可能有助于捕获此类的一些错误。

以上内容适用于任何类型的指针,而不仅仅是boost::thread*