osg的ref_ptr和observer_ptr

ref_ptr就是所谓的强指针类型

observer_ptr是所谓的弱指针类型

需要注意的是他们都是类,而不是指针,只不过他们用于管理指针。

1.如何实现自动内存管理

所谓自动内存管理就是只管对象或指针的创建和使用而不管销毁。

实现自动内存管理指的是ref_ptr,他工作的机理就是每当多引用一次对象(比如addChild)其引用计数就会增加1,多删除一次对象(removeChild)其引用计数就会减1,如果引用计数为0,则销毁对象。

另外定义其对象实例会有生命周期,在对象实例超出生命周期进行销毁时会自动释放所管理的指针,因而实现内存管理,如下代码:

class AAA:public osg::Referenced{

};

int
main(int argc, char** argv)
{
    {
        osg::ref_ptr<AAA> hhh=new AAA();//超出其生命周期时会自动释放AAA指针,从而实现内存管理
    }
    
}

2.管理的对象有所区别

ref_ptr会用引用计数器管理同一个对象,避免重复拷贝占用内存。observer_ptr会采用观察者模式管理对象,不会干扰对象的创建和销毁。

ref_ptr一般可以管理任何对象指针,包括自定义的类等。而observer_ptr管理的只能是继承自osg::Referenced的对象。比如下面代码会报错:

class AAA{

};

int
main(int argc, char** argv)
{
    osg::ref_ptr<AAA> hhh=new AAA();
    osg::observer_ptr<AAA> ohhh(hhh);// error: C2039: “getOrCreateObserverSet”: 不是“AAA”的成员
}

将AAA改成继承自osg::Referenced则没有问题。

class AAA:public osg::Referenced{

};

int
main(int argc, char** argv)
{
    osg::ref_ptr<AAA> hhh=new AAA();
    osg::observer_ptr<AAA> ohhh(hhh);
}

3.内存泄漏就一去不复返了吗

需要注意的是,使用ref_ptr并不能避免内存泄漏,因为其有release函数,将对象的管理权移交(很有可能不再采用ref_ptr来管理对象了),如果移交不慎(接受者在不使用对象时不进行释放),就会造成内存泄漏。

猜你喜欢

转载自blog.csdn.net/hankern/article/details/84934342