最近做项目写代码遇到了对象自杀的问题。

第一个是自己设计的,对象持有定时器,自己维护生命周期。

第二个是无意中遇到的,由于采用boost的线程库,将成员函数变为线程用,最后在一堆调用之后居然把自己杀掉了。

很不幸的是,在过程中都遇到了相同的问题——堆栈挂掉了。

然后一轮定位,居然都是boost mutex的问题,scoped_lock很容易让人放松警惕。

void XXX()
{
    boost::recuisive_mutex::scoped_lock lk(m_mutex);

    

    YYYY();

    
}

void YYY()
{
    

    delete p;// 释放XXX所在对象

    
}

作为类成员的mutex没有被解锁,然后所在的类就被释放了,这就造成了堆栈挂掉。

对象自杀显然不是一种很好的风格,还是尽量避免吧!