加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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 *.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读