使用C++智能指針的樹結構的問題

現在C++17版本里,基本上都是使用智能指針了。

在std::shared_ptr被引入之前,C++標準庫中實現的用於管理資源的智能指針只有std::auto_ptr一個而已。std::auto_ptr的作用非常有限,因爲它存在被管理資源的所有權轉移問題。這導致多個std::auto_ptr類型的局部變量不能共享同一個資源,這個問題是非常嚴重的。因爲我個人覺得,智能指針內存管理要解決的根本問題是:一個堆對象(或則資源,比如文件句柄)在被多個對象引用的情況下,何時釋放資源的問題。何時釋放很簡單,就是在最後一個引用它的對象被釋放的時候釋放它。關鍵的問題在於無法確定哪個引用它的對象是被最後釋放的。std::shared_ptr確定最後一個引用它的對象何時被釋放的基本想法是:對被管理的資源進行引用計數,當一個shared_ptr對象要共享這個資源的時候,該資源的引用計數加1,當這個對象生命期結束的時候,再把該引用技術減少1。這樣當最後一個引用它的對象被釋放的時候,資源的引用計數減少到0,此時釋放該資源。

weak_ptr是爲了配合shared_ptr而引入的一種智能指針,因爲它不具有普通指針的行爲,沒有重載operator*和->,它的最大作用在於協助shared_ptr工作,像旁觀者那樣觀測資源的使用情況。weak_ptr可以從一個shared_ptr或者另一個weak_ptr對象構造,獲得資源的觀測權。但weak_ptr沒有共享資源,它的構造不會引起指針引用計數的增加。使用weak_ptr的成員函數use_count()可以觀測資源的引用計數,另一個成員函數expired()的功能等價於use_count()==0,但更快,表示被觀測的資源(也就是shared_ptr的管理的資源)已經不復存在。weak

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章