查看: 1397|回复: 2

关于智能指针的问题

[复制链接]

该用户从未签到

发表于 2009-10-23 09:43:57 | 显示全部楼层 |阅读模式
如果使用了智能指针,是否就不需要进行delete?
在我接触的c/c++代码中,一般new之后都需要进行delete,但是我在osg的例子程序中看到一半都直接用new,而不是用智能指针,而且也并没有进行delete,想问一下,这样不会造成内存泄露么?有些疑惑这个问题。

该用户从未签到

发表于 2009-10-23 09:56:09 | 显示全部楼层
OSG本身就使用ref_ptr来维护的,也就是说,如果有这样的代码:
  1. osg::Group* group = new osg::Group;
  2. root->addChild( group );
复制代码
那么是不会有内存泄露的,因为root节点已经用ref_ptr来维护传入的group指针了。换句话说,即使是直接用new分配的节点以及Referenced派生对象,只要在之后某一时刻被传入到ref_ptr中,就可以保证它接受OSG的内存管理策略

但是,如果您自己写了一个类,例如:
  1. class MyClass
  2. {
  3. public:
  4.     void addGroup( osg::Group* group ) { _group = group; }
  5. protected:
  6.     osg::Group* _group;
  7. };
复制代码
如果传入addGroup的节点是使用new分配的,并且没有被别的OSG对象所引用,那么它将造成内存泄露;而如果这个节点是用ref_ptr分配的,那么当ref_ptr的生命空间完结后,它将被自动释放,MyClass中存储的因此将成为一个非法指针!

该用户从未签到

 楼主| 发表于 2009-10-26 08:10:11 | 显示全部楼层
非常感谢,真是受益匪浅啊!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表