最近做项目写代码遇到了对象自杀的问题。
第一个是自己设计的,对象持有定时器,自己维护生命周期。
第二个是无意中遇到的,由于采用boost的线程库,将成员函数变为线程用,最后在一堆调用之后居然把自己杀掉了。
很不幸的是,在过程中都遇到了相同的问题——堆栈挂掉了。
然后一轮定位,居然都是boost mutex的问题,scoped_lock很容易让人放松警惕。
void XXX()
{
boost::recuisive_mutex::scoped_lock lk(m_mutex);
YYYY();
}
void YYY()
{
delete p;// 释放XXX所在对象
}
作为类成员的mutex没有被解锁,然后所在的类就被释放了,这就造成了堆栈挂掉。
对象自杀显然不是一种很好的风格,还是尽量避免吧!