查看: 1115|回复: 4

关于osg::ref_ptr的使用

[复制链接]

该用户从未签到

发表于 2015-8-8 21:51:11 | 显示全部楼层 |阅读模式
1.OSG版本:3.0.1,VS2010编译
2.VS2010

问题描述:
void test(void)
{
        osg::ref_ptr<osg::Geode> geode1 = createGeode1();  // 这句不注释时,下面调用createGeode2会出错。注释后确不会报错。
        osg::ref_ptr<osg::Geode> geode2 = createGeode2();  //
}

osg::Geode* createGeode1(void)
{
        osg::ref_ptr<osg::Geode> geode = new osg::Geode;

        // ptr在函数结束被析构,原引入对象的引用计数为0,自动析构
        return geode.get();
}

osg::Geode* createGeode2(void)
{
        osg::ref_ptr<osg::Geode> geode = new osg::Geode;

        // ptr在函数结束被析构,原引入对象的引用计数为0,但不自动析构
        return geode.release();
}

该用户从未签到

 楼主| 发表于 2015-8-8 22:17:10 | 显示全部楼层
1.不能准备的表达问题所在,但似乎是和OSG本身无关,和new的操作有关?
2.调用createGeode1()后,其内部new的空间已经释放了,但地址还被geode1保留着。
3.再次调用new时,就出错。是因为new操作符会访问上次new的地址计算其空间大小,然后偏移再申请堆空间吗?
4.调用createGeode2()之前,把geode1置空,则createGeode2()调用正常。

该用户从未签到

 楼主| 发表于 2015-8-8 22:23:24 | 显示全部楼层
3072696460 发表于 2015-8-8 22:17
1.不能准备的表达问题所在,但似乎是和OSG本身无关,和new的操作有关?
2.调用createGeode1()后,其内部ne ...

用以下代码测试,new并不会出错

int* ptr1 = new int;
memset(ptr1, 0x0, sizeof(int));
delete ptr1;

int* ptr2 = new int;

该用户从未签到

 楼主| 发表于 2015-8-8 22:32:21 | 显示全部楼层
3072696460 发表于 2015-8-8 22:23
用以下代码测试,new并不会出错

int* ptr1 = new int;

发现 调用 createGeode1() 之后,再new osg相关对象,就会出现堆错误。

还是 不解。。。

该用户从未签到

 楼主| 发表于 2015-8-9 09:34:13 | 显示全部楼层
3072696460 发表于 2015-8-8 22:32
发现 调用 createGeode1() 之后,再new osg相关对象,就会出现堆错误。

还是 不解。。。


问题应该是出在这里。但这里的“_ptr->ref();”却还不会提示错误,要构造完geode1并直到下一次new时才报错,这是出于OSG的内存管理机制?还不是很明白。

另:
试过改为这样时,调用createGeode2()则不会报错。
osg::Geode* geode1 = createGeode1();
osg::ref_ptr<osg::Geode> geode2 = createGeode2();

另:
代码本身就有错,只是想明白为什么。。。
无标题.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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