最近做項目寫代碼遇到了對象自殺的問題。

第一個是自己設計的,對象持有定時器,自己維護生命周期。

第二個是無意中遇到的,由于采用boost的線程庫,將成員函數變為線程用,最后在一堆調用之后居然把自己殺掉了。

很不幸的是,在過程中都遇到了相同的問題——堆棧掛掉了。

然后一輪定位,居然都是boost mutex的問題,scoped_lock很容易讓人放松警惕。

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

    

    YYYY();

    
}

void YYY()
{
    

    delete p;// 釋放XXX所在對象

    
}

作為類成員的mutex沒有被解鎖,然后所在的類就被釋放了,這就造成了堆棧掛掉。

對象自殺顯然不是一種很好的風格,還是盡量避免吧!