c – 为什么boost :: thread可以被删除两次?
发布时间:2020-12-16 10:30:00 所属栏目:百科 来源:网络整理
导读:我注意到一些奇怪的事我希望运行以下代码生成段错误,但事实并非如此. void DeadlineTimeOut(const boost::system::error_code pErrorCode,boost::thread* pThread) { std::cout "Error code: #" pErrorCode.value() " Message: " pErrorCode.message() std::
我注意到一些奇怪的事我希望运行以下代码生成段错误,但事实并非如此.
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}" } 那么,为什么双重删除可能?并且还要召集会员?我此刻有点困惑. 解决方法
删除指针两次是
undefined behaviour.不能保证段错误.如果你幸运,你可能会得到一个;你可能不会.代码可能会通过所有测试,然后在最糟糕的时刻在客户面前爆炸.见
C++ FAQ.
取消引用已删除的指针(代码中的pThread-> get_id())也是如此. 一个简单的防御技术是一旦删除它们就将指针设置为NULL,而不是让它们为dangle.这可能有助于捕获这种类型的一些错误. 以上适用于任何类型的指针,而不仅仅是boost :: thread *. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |