OSG的垃圾回收机制
為了讓OSG的開發者更加專注與功能開發遠離c++最最煩心的指針(當然指針也是c++如此牛掰的根源),OSG也使用了類似其他一些高級語言的GC.
OSG的垃圾回收主要是包含兩個方面: osg::ref_ptr<>-自動回收內存 和 osg::Referenced-引用計數類.
?
osg::ref_ptr<>
?
osg::ref_ptr<>既可以向c++的普通指針一樣使用(operator*(),operator->,operator=()),也有它的高級功能(operator==(), operator!=() , operator!(),valid(),release()).
類似普通指針的幾個方法和operator==(), operator!=() , operator!()就不介紹了.
valid()和some_ptr!=NULL是一樣的.判斷指針是否為空
release()這個方法是返回一個智能指針指向的內容,主要作用:因為c++局部變量的作用域是兩個大括號之間,當程序運行過大括號時,osg::ref_ptr<>會自動釋放其指向的內存空間,所以如下方法:
作者:kjwang 鏈接:https://zhuanlan.zhihu.com/p/37816503 來源:知乎 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。#include <osg/ref_ptr> #include <osg/Referenced> #include <iostream> class MonitoringTarget : public osg::Referenced {public:MonitoringTarget( int id ) : _id(id){ std::cout << "Constructing target " << _id << std::endl; }protected:virtual ~MonitoringTarget(){ std::cout << "Destroying target " << _id << std::endl; }int _id; }; osg::ref_ptr<MonitoringTarget> target = new MonitoringTarget(0); std::cout << "Referenced count before referring: "<< target->referenceCount() << std::endl; osg::ref_ptr<MonitoringTarget> anotherTarget = target; std::cout << "Referenced count after referring: "<< target->referenceCount() << std::endl; for ( unsigned int i=1; i<5; ++i ) {osg::ref_ptr<MonitoringTarget> subTarget = new MonitoringTarget(i); }打印結果:
?
而我們想在一個函數中返回其中一個局部osg::ref_ptr<>變量所指向的內容時,
MonitoringTarget* createMonitoringTarget( unsigned int id ) {osg::ref_ptr<MonitoringTarget> target = new MonitoringTarget(i);return target.get(); }就會發現上述代碼得不到內容.
此時我們就會用到release()函數了.
MonitoringTarget* createMonitoringTarget( unsigned int id ) { osg::ref_ptr<MonitoringTarget> target = new MonitoringTarget(i); return target.release(); }release()的作用就是禁止智能指針釋放其所指向的內容,且返回一個c++的普通指針.
注意: 接這個函數的返回值時必須用新的osg::ref_ptr<>包裝一下,這樣就可以正常使用了.
?
osg::Referenced
?
osg::Referenced類是osg中所有成員的base class.它的方法主要是 ref(),unref(),referenceCount().
ref().是在這個類被osg::ref_ptr<>包裝時,就是把計數器+1.
unref():包裝了這個類的osg::ref_ptr<>被釋放時,計數器-1.當為0時,就是回收這塊內存空間.
注意:osg::Referenced類的析構函數是protected類型的.所以不可以在局部變量中使用以下代碼:
?
注意:既然是引用計數,一定要知道它的最大的不足就是循環引用.
上圖是兩種循環引用的情況,自循環和相互引用.這都是在使用智能指針(引用計數形)一定要注意的地方.
本文轉自:https://www.zhihu.com/column/c_187589347
總結
以上是生活随笔為你收集整理的OSG的垃圾回收机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#创建文件夹和文件
- 下一篇: 制作漫画风图片(无需下载APP无需PS无