我注意到一些奇怪的事情。我希望通过以下代码生成段错误,但事实并非如此。
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}"
}
那么,为什么双重删除可能?并且还要召集会员?我现在有点困惑。
答案 0 :(得分:13)
两次删除指针是undefined behaviour。不保证会出现段错误。如果你幸运,你可能会得到一个;你可能不会。代码可能会通过所有测试,然后在最糟糕的时刻在客户面前爆炸。请参阅C++ FAQ。
取消引用已删除的指针(代码中的pThread->get_id()
)也是如此。
一种简单的防御技术是在删除指针后立即将指针设置为NULL,而不是让它们dangle。这可能有助于捕获此类的一些错误。
以上内容适用于任何类型的指针,而不仅仅是boost::thread*
。