gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:44:30 26 4
gpt4 key购买 nike

我注意到了一些奇怪的事情。我希望运行以下代码会产生段错误,但事实并非如此。

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com