人成免费a级毛片-黄色免费看片软件-欧美一级裸体视频,亚洲精品综合久久中文字幕,精品一区二区视频,久久www人成免费产片

資源中心

Resource Centers

2020-12-16

OSG基礎之內存管理

OSG是使用C++語言開發的,而該語言在動態內存管理方面做得并不好,經常需要程序員手動申請和釋放內存。這種靠人工管理內存的方式不僅繁瑣,而且極易造成內存泄漏,尤其在一個中大型系統中,靠人工管理內存是一項艱巨的任務。




如何解決這類問題???



數據類型osg::ref_ptr(智能指針)在源碼中隨處可見,它和另外一種數據類型osg::observer_ptr(觀察指針)為我們提供了非常良好的動態對象使用體驗。


智能指針的用法


osg::Node* pNode = new osg::Node();

osg::ref_ptrrpNode=pNode;

if(rpNode.valid())

{  

rpNode-> ...

}


通過osg::Node實例化一個智能指針模板對象rpNode,該對象可以直接保存一個使用new關鍵字動態創建的osg::Node對象,并可通過valid() 方法判斷內部對象是否有效。


使用->操作符直接對內部對象進行調用,這里無需關心osg::Node對象的釋放,因為在智能指針對象rpNode析構時會自動檢查是否需要刪除對象,如果需要則直接刪除。


觀察指針的用法


osg::Node* pNode = new osg::Node();

osg::observer_ptropNode=pNode;

if(opNode.valid())

{

opNode-> ...

}


osg::observer_ptr與osg::ref_ptr的用法基本相同,不同的是osg::observer_ptr不負責對象的釋放,這也是為什么叫它觀察指針的原因,可理解為只觀察不管理。


所以,上面代碼如果沒有其他osg::ref_ptr智能指針對創建的osg::Node對象進行管理,將造成內存泄漏,該對象將不會自動釋放。


實現原理


osg::ref_ptr和osg::observer_ptr是兩個模板類,而用于實例化該模板類的類型必須從osg::Referenced繼承。OSG中大多數類型都是從該類繼承而來的,它才是實現內存自動管理的核心所在。



osg::Referenced類最主要的功能是內部維護了一個引用計數_refCount,并提供了ref()和unref()函數來負責該引用計數的遞增和遞減。在unref()函數中,當_refCount遞減為0值時會自動釋放該對象占用的內存。

    

    有了osg::Referenced類的支持,對于osg::ref_ptr而言其實只需要做兩件事:


    1)在著手管理一個對象時調用該對象的ref()方法增加其引用計數;

    2)當不在管理該對象時調用該對象的unref()方法減少其引用計數



osg::observer_ptr的實現正如它的名字一樣,是通過一種簡單的“觀察者”設計模式來實現的。osg::Referenced內部維護了一個觀察者列表,并且在引用計數遞減為0時主動通知所有的觀察者對象,每一個osg::observer_ptr對象都是一個觀察者。


    對于osg:: observer _ptr而言需要做以下三件事:


    1)在開始觀察一個對象時將自己加入到該對象的觀察者列表中;

    2)在停止觀察對象時將自己從該對象的觀察者列表中移除;

    3)收到觀察者通知時,將內部觀察的對象設置為無效。

<section style="margin: 0px; padding: 0px 20px; max-width: 100%; box-sizing: border-box; word-wrap: break-word !important; display: inline-block; width: 677px; vertical-align: top; background-image: url(" wx_fmt="gif");" background-position:="" background-repeat:="" background-size:="" background-attachment:="">


關系如下

1.png


通過下表,我們來體會一下OSG中對象的創建和釋放的過程,以及在這當中智能指針與觀察指針的作用,引用計數的變化情況等。


2.png



每一個osg::ref_ptr對象都占有一個被引用對象的引用計數,在正常情況下只要最后一個osg::ref_ptr還在使用,被它引用的對象就不會釋放。所以osg::ref_ptr可用于需要長期使用并保證一個對象可用的情況。


osg::observer_ptr 作為對象的觀察者,最大的作用就是可以在訪問其觀察的對象時,判斷該對象是否已經被銷毀了。它只是嘗試性的使用,不對觀察對象產生任何影響,觀察的對象隨時可能被釋放,所以應該經常使用valid()方法判斷其有效性。


通過以上介紹,相信大家對OSG的智能指針和觀察指針都有了一定程度的理解,并且可以在不同場景下做到正確使用。

更多服務

More services