调用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;
出于好奇心。
答案 0 :(得分:3)
显式调用堆栈分配对象的析构函数是一个非常糟糕的想法(tm)。原因是一旦析构函数启动,对象在技术上不再存在,但C ++不知道并且当对象超出范围时将再次调用析构函数,这将导致未定义的行为。对此类对象执行任何其他操作(如调用成员函数)也是未定义的行为。所以你不能指望所描述的设置有任何合理的行为,只是不要这样做。
答案 1 :(得分:2)
SL_.~unique_lock();
一旦调用在本地存储上分配的对象的析构函数,它就不再存在了。
在调用析构函数后引用对象成员是未定义行为。
未定义的行为意味着任何行为都是可能的,并不一定意味着您的代码崩溃,但这意味着您可以看到不正确的行为或任何随机行为。
所以就是不要这样做。