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

时间:2012-03-27 09:43:13

标签: c++ multithreading boost mutex

调用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;

出于好奇心。

2 个答案:

答案 0 :(得分:3)

显式调用堆栈分配对象的析构函数是一个非常糟糕的想法(tm)。原因是一旦析构函数启动,对象在技术上不再存在,但C ++不知道并且当对象超出范围时将再次调用析构函数,这将导致未定义的行为。对此类对象执行任何其他操作(如调用成员函数)也是未定义的行为。所以你不能指望所描述的设置有任何合理的行为,只是不要这样做。

答案 1 :(得分:2)

SL_.~unique_lock(); 

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

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