调用 boost::lock 析构函数的效果?

Effect of calling destructor of boost::lock's?

本文关键字:析构函数 boost lock 调用      更新时间:2023-10-16

显式调用boost::lock对象的析构函数是否有任何后果?

例如:

boost::mutex M_;
boost::mutex::scoped_lock SL_(M_);
SL_.~unique_lock();
SL_.unlock();
SL_.lock();
//both of the above work on runtime as if nothing happened to SL_
//note: typedef unique_lock<mutex> scoped_lock;

出于好奇而询问。

显式调用堆栈分配对象的析构函数是一个非常糟糕的想法(tm)。原因是一旦析构函数启动,对象在技术上就不存在了,但C++不知道,当对象超出范围时,它会再次调用析构函数,这将导致未定义的行为。对这样的对象执行任何其他操作(比如调用成员函数)也是未定义的行为。因此,您不能期望从所描述的设置中得到任何合理的行为,只是不要这样做。
SL_.~unique_lock(); 

一旦调用了分配在本地存储上的对象的析构函数,它就不再是活动的
调用析构函数后引用对象成员是一种未定义的行为

未定义的行为意味着任何行为都是可能的,并不一定意味着你的代码崩溃,但它意味着你可以看到不正确的行为或任何随机行为
所以不要那样做。