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

标签 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}"
}

那么,为什么可以进行双重删除呢?还调用成员(member)?我现在有点困惑。

最佳答案

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

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

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

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

关于c++ - 为什么 boost::thread 可以被删除两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7416872/

相关文章:

java - 限制一个java命令的线程数

xcode - 如何使用 NSKeyedArchiver 对自定义类进行编码和解码

c++ - 带有字符串和 bad_alloc 检查的构造函数

linux - 虚拟地址映射到物理地址是什么意思?

c++ - 如何创建用捕获的变量包装 lambda 的仿函数?

c++ - Python PIL Image.tostring ('raw' ) 和 OpenCV 的 IplImage->imageData

c++ - 在当前 Linux 发行版上打包 C++11 软件是否安全?

java - 如何完全停止线程的执行

c++ - Clang 替换 -mthreads 选项

c++ - 使用 fstream 时的 Xcode 断点