查看: 1276|回复: 16

关于析构函数!

[复制链接]

该用户从未签到

发表于 2012-5-23 23:53:28 | 显示全部楼层 |阅读模式
本帖最后由 travller 于 2012-5-24 01:25 编辑

  大家好!今天在看OSG的Shape类的源码时,发现该类以及其子类的的析构函数全部是虚的,而C++编程规范有一条说里面说:基类的析构函数应为公用虚拟的或者保护非虚类型。OSG这样实现是为什么? 为什么把Shape类及其子类的析构函数全部设为受保护的虚函数?
   还有geode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0f,0.0f,0.0f),radius),hints))这句代码,如果我把它分解为osg:: Vec3 centre(0.0f,0.0f,0.0f); osg::Sphere sphere(centre,radius),那么将无法通过编译,提示的信息相信很多人都能知道:即无法获取受保护类型的析构函数~Sphere()的权限(因为此时编译器会自动找寻位于栈上的该对象的析构函数,但发现其不是公有的,所以就报错)。而geode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0f,0.0f,0.0f),radius),hints))这句代码(出自FreeSouthOSG程序设计一书P79),之所以能编译通过,是因为addDrawable的实参指针指向的内存位于堆上,并且在代码中没用显式的delete删除该块内存,因而不会调用每个相关类的析构函数,如果在一个大场景中也这样实现的话, 当动态地不想显示一些图形时(不是mask那样会浪费内存),刚刚在VS2010下用switch类写了代码测试了下是可以达到目的,我想问的是switch是如何管理节点对象的内存的,难道其关闭时不会调用类的析构函数吗?在最后拜托某些拿回帖当成“义务”性工作的并且自以为是管理员,如果你们不懂,不要轻易的回帖!

该用户从未签到

发表于 2012-5-24 11:22:07 | 显示全部楼层
1 "switch类" 是指osg::Switch类吗? 这个地方没说清楚。
2    正如你说的那样,osg的绝大多数类都设计为保护类型的析构函数。场景图形节点,如果节点不分配为堆上,会带来很多麻烦。 osg这样的设计是强制把内存分为在堆上。 你说的关闭时,调用析构,这个可以说的更清楚点,把code贴上。

3 你的最后一句话打击面太大了,论坛不是搞科研,我的Mentor第一天就告诉我要学会宽容,建议你删除吧。 总回复同一个问题,谁都会不耐烦的。人非圣贤,谁都会犯错的。

该用户从未签到

发表于 2012-5-24 14:15:06 | 显示全部楼层
rerf_ptr为了保证智能指针的特性不被delete所干扰而使用了protected析构;至于virtual,这个不解释。只是一条条抠规范的人,学开发只能说明您走错路了
而智能指针是如何实现的,这个已经有足够多的教程说明了,不理解的可以去看相关的部分

至于那个帖子里我错没错,我给出了相关链接可以了解。您这种浮躁之士我并不是第一次见也不是最后一次见,我只对事从不对人,对您的品质也懒的多说

该用户从未签到

 楼主| 发表于 2012-5-24 14:56:05 | 显示全部楼层
array 发表于 2012-5-24 14:15
rerf_ptr为了保证智能指针的特性不被delete所干扰而使用了protected析构;至于virtual,这个不解释。只是一 ...

我真的对你很无语,你的回复每一条都让人很蛋疼:因为你不尊重别人,所以无论你怎么回帖,永远不会得到别人的尊重。我在这个帖子中只是提了一下C++中一条编程的规范,我并没有死扣字眼,我只是发出疑问,你凭什么说我学开发走错了路,每个人在编程的过程中都会遇到各种疑问?在另外一个帖子中,你的回答先是说我的OSG不是在VS2010下编译的,我的帖子明明都写的清清楚楚(在VS2010下运行时出错),最后我在外国官网下载了新的OSG openthreads的dll安装后在调试环境下可以运行,于是我回复你说你的想法不对,你又回复了我的逻辑很可笑,你会尊重吗?你说的每一句都对?那你还在这里回帖干什么,直接去开发一套SDK得了?

该用户从未签到

发表于 2012-5-24 15:10:31 | 显示全部楼层
只是一条条抠规范的人,学开发只能说明您走错路了
如果您直接将自己代入到这句话里,那么就不是我的事情了~~至于所谓尊重,我并不缺少,也不需要更多,我只挣取自己的实力能够配得上的就够了;并且也已经得到了足够多的人的认可,不强求多您一个~~
在VS2010下运行 != 在VS2010下编译源代码,我无法排除您用了VS9的库去匹配VS10,也无法排除您所用的第三方库是这样。而对于您或者别人的武断结论,我的回帖一向如此,不需要对任何人客气~~一个客气的环境是无法让人提高的

至于您在AlphaPixel或者OSG官方下载的预编译包,很遗憾那都是我参与制作的~~您不爽的话可以删掉

该用户从未签到

 楼主| 发表于 2012-5-24 15:28:16 | 显示全部楼层
本帖最后由 travller 于 2012-5-24 15:29 编辑
CWorld 发表于 2012-5-24 11:22
1 "switch类" 是指osg::Switch类吗? 这个地方没说清楚。
2    正如你说的那样,osg的绝大多数类都设计为保 ...


你好!
1.这里是指osg::switch的开关类;
2.一开始我也想到了将析构函数设为protected是强制将类对象分配在堆上,但是这样一来写出来的代码感觉不像以前那么简洁明了
,就是说如果你想把一句很长的代码进行分拆,必须为每一个具有保护类型的析构函数的类对象用超级指针进行实例化,否则编译就会不通过如geode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0f,0.0f,0.0f),radius),hints));这行代码,如果拆开写的话必须要写成这样osg::ref_ptr<osg::Sphere> sphere=new osg::Sphere(osg::Vec3(0.0f,0.0f,0.0f),radius);
osg::ref_ptr<osg::ShapeDrawable> sd=new osg::ShapeDrawable(sphere,hints);。您能和我谈谈OSG中如果不把对象强制分配在堆上能带来哪些不利吗?至于将一个节点加到switch对象中,并关闭时如sw->addChild(transBuiltIn,false);FreeSouth在他的书中说此时该节点transBuiltIn的内存会被释放,我疑问的是既然被释放那么是不是要调用每一个对象的析构函数包括受保护的析构函数,如果调用了,那么又是如何调用的?(通常情况下此时受保护的析构函数应该无法被调用);如果没有被调用,那么也许是由OSG超级指针在发挥作用,我要好好摸索下?。我的代码很简单,下面是和该贴相关的代码:
osg::ref_ptr<osg::Node> CreateBuiltInShape()
{
        float radius=0.08f;//内置球图元模型的半径
        float height=0.1f;//内置模型的高
        osg::ref_ptr<osg::TessellationHints> hints=new osg::TessellationHints();//模型精确度类
        hints->setDetailRatio(0.5f);//设定模型的精确度,值越大表示模型的越细腻
       
        osg::ref_ptr<osg::Geode> geode=new osg::Geode();
        osg::ref_ptr<osg::Sphere> sphere=new osg::Sphere(osg::Vec3(0.0f,0.0f,0.0f),radius);
        osg::ref_ptr<osg::ShapeDrawable> sd=new osg::ShapeDrawable(sphere,hints);
        geode->addDrawable(sd);
        return geode;
}

int _tmain(int argc, _TCHAR* argv[])
{
   osgViewer::Viewer viewer;
    osg::ref_ptr<osg::Group> root=new osg::Group();
    osg::ref_ptr<osg::MatrixTransform> transBuiltIn=new osg::MatrixTransform();
        transBuiltIn->setMatrix(osg::Matrix::translate(0,0,-2));
        osg::ref_ptr<osg::Node> builtIn=CreateBuiltInShape();
        transBuiltIn->addChild(builtIn);

osg::ref_ptr<osg::Switch> sw=new osg::Switch();
        sw->addChild(transBuiltIn,true);//sw->addChild(transBuiltIn,false)
        root->addChild(sw)


               viewer.setSceneData(root);
        viewer.realize();
        viewer.run();
        return 0;
}

3.关于你的说的宽容:我不是说一个人回帖回的不对就说他很差,那样我会很次。问题是我给回我帖子的人留言说他想的不对,之后他给我的回复,(也许是他表达不好的缘故),就是让人感到他不是一个有自尊的人,自以为是,因为他不懂得尊重别人!

该用户从未签到

 楼主| 发表于 2012-5-24 15:41:34 | 显示全部楼层
array 发表于 2012-5-24 15:10
如果您直接将自己代入到这句话里,那么就不是我的事情了~~至于所谓尊重,我并不缺少,也不需要更多,我只 ...

哈哈看来你生气?2010运行!=2010下编译,拜托不要用你的“可笑的思维”去理解别人,OK?我还不会傻到在VC6下编译OSG然后跑到2010下编译,难道你没用过CMAKE吗?l另外我想说的是,是你先不尊重我,然后我当然会反击你!到底谁先谁后,在另外一个帖子中,是人都会看清楚?至于你说的OSG预编译包(你在另外一个帖子中跟我扯,调试环境下编译出来的东西对于每一台机器都是特定的,既然这样那为什么我换了一个DLL后一切就搞定了);还有就是如果OSG是你一个人独立制作的我会立马删除,可惜你不是!我最后想说的是:OSG的世界里少你一个照样能渲染出一个美妙的环境!

该用户从未签到

发表于 2012-5-24 15:58:16 | 显示全部楼层
      纠结于vs2008 or 2010,debug or release,MT or MD......问题的朋友,首先仔细查看一下第三方依赖库的版本是否一致,来这里发问的几乎都是第三方依赖库编译环境不一致
      用开源库最好能自己把库都编译一遍,自己多体会一下,慢慢来,用别人编译好的第三方库经常容易出现摸不着头脑的问题,步子迈太大容易扯着蛋

该用户从未签到

发表于 2012-5-24 16:21:52 | 显示全部楼层
2010运行!=2010下编译
您没有这么做过,不等于不可以这么做,事实上VC6下编译OSG然后在2010下依赖并运行并没有太多问题。我没有删除您的帖子就说明我没有生气,只是觉得闲暇时可以耍耍而已,多维护一下论坛也没什么不好~~

至于为什么换了DLL后可以,去检查您的manifest就知道了,我没有武断定义过“调试环境下编译出来的东西对于每一台机器都是特定的”这句话。

还有您最后的愤慨之言貌似很像是对于一个即将滚出XXX的人说的,可惜我还得参与维护OSG官网的SVN,文档,邮件组和日常新闻,暂时不能滚开,呵呵
  • TA的每日心情
    开心
    2023-10-26 21:41
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2012-5-24 22:01:05 | 显示全部楼层
    开源的东西,依赖库很多,版本多,确实很容易产生问题,论坛是用来交流技术的,提问者谦虚点,回答问题者负责点,那么肯定会产生良好的学习交流气氛,大家何必互相嘴炮呢~
    回LZ关于堆的那个问题可以参考《more effective c++》第二版,第7章,item25-item27,会对你很有启发~

    该用户从未签到

    发表于 2012-5-25 00:25:33 | 显示全部楼层
    论坛中有点嘴炮,对活跃气氛很有好处~~“良好的学习交流”其实就是激烈的争论中产生的,而不是一直以来温吞水的方式,只要不上升到过分的人身攻击就好。至于“谦虚”“负责”,这些都是网络环境下几乎做不到的,不必强求

    至于楼主的怒火来源很简单,就是我对他的评价“逻辑很可笑”。技术上的对立和我眼中的明显错漏,我一般不留情面,也不会给什么“尊重”——如果您认为这会上升到尊重的层面的话——因为这对于知识的积累和交换是多余的。如果不服气欢迎针锋相对,在技术层面的嘴仗赢过我当然最好,上升为骂战然后您能占得上风那也不赖。我从来不讨厌狂生,愤青和牙尖嘴利之人,当然前提是身上也得有几分斤两~~

    该用户从未签到

     楼主| 发表于 2012-5-25 14:35:25 | 显示全部楼层
    array 发表于 2012-5-25 00:25
    论坛中有点嘴炮,对活跃气氛很有好处~~“良好的学习交流”其实就是激烈的争论中产生的,而不是一直以来温吞 ...

    呵呵,你到会扬长避短。但是千万不要自以为是,因为在好的猎手都会有伤着自己的那一天,何况你敢说你自己是最牛的猎手吗!对我来说OSG只是工具,正如我的名字那样我只是OSG世界中的一个Traveller,有可能学完和现阶段项目相关的OSG知识后,我在也不会接触OSGr;对于你,也许你在OSG世界中,还要继续“耕耘”,也许你有很深的OSG底蕴,但是底蕴不代表你说的什么都是对的,“智者千虑必有一失”,当别人否决你的说法时,你会觉得自己被贬低了,这样的人还算得上智者吗?-----我只不过在帖子中回了一句“你的想法是不对的”,于是你说我的逻辑很可笑,而至于我的可笑之处在那,你又没有点明,你这样的做法纯粹就是满足你那与日增长的“自满心理”;你难道到现在还没发觉自己在另外一个帖子中,自己的每一个回复有多么可笑,我不得不为你感到悲哀!

    该用户从未签到

     楼主| 发表于 2012-5-25 14:36:39 | 显示全部楼层
    csdn 发表于 2012-5-24 22:01
    开源的东西,依赖库很多,版本多,确实很容易产生问题,论坛是用来交流技术的,提问者谦虚点,回答问题者负 ...

    好的,谢谢你,这个问题我在另外一个国外论坛的论坛的帖子里找到答案了!

    该用户从未签到

     楼主| 发表于 2012-5-25 14:40:20 | 显示全部楼层
    array 发表于 2012-5-24 16:21
    您没有这么做过,不等于不可以这么做,事实上VC6下编译OSG然后在2010下依赖并运行并没有太多问题。我没有删 ...

    array array 当前离线 注册时间2008-2-3最后登录2012-5-25在线时间1609 小时阅读权限255积分17594帖子8313精华53UID5.  IP卡  狗仔卡

    管理员





    串个门加好友打招呼发消息. 5楼
    发表于 2012-5-17 09:43:48 |只看该作者 给了您也没有用,debug版本和不同机器的环境配置密切相关
    这个不是你说的?难道你真是贵人?

    该用户从未签到

    发表于 2012-5-26 11:10:01 | 显示全部楼层
    debug版本和不同机器的环境配置密切相关
    这句话是我说的,并且是显然的,VS环境,操作系统,32/64位,MD/MT设置,必须有的SP1,还有恼人的manifest。这些我不是没有提过,可惜您根本就没有把重点放在这里,而是放在如何和我斗嘴上。

    LdrpWalkImportDescriptor() failed to probe C:\OSG\bin\ot12-OpenThreadsd.dll for its manifest
    这个就是您给出的问题,我也不止一次地提到了manifest。google一下就可以立即发现各种中英文的文档,您查阅过了吗?您覆盖安装了别人的内嵌了manifest的debug库,您知道这一点吗?您浏览过manifest信息并且和自己的系统比较过吗?您知道自己之前为什么不能正常运行的原因了吗?您知道如何让自己之前的程序正常运行起来吗?您真的想要学懂知识吗,而非简单地通过什么毕业设计或者老板的任务??

    低版本的release库作为高版本的依赖,甚至mingw编译出来的库作为vs工程的依赖,这些都是可以做到的,否则您也没什么可能用上ffmpeg(它的VS版本是收费的)这类超级工具。这又是另一个问题引出的另一回事,您就这么把两者联系在一起了?

    这论坛里有几个朋友给过我非常深刻的印象。一位朋友曾与我争论包围盒坐标系的问题。我一开始固执己见并几乎恶语相向,后来却发现自己不得不服从于精细的图示和明确的代码,我特地和Robert与PaulMartz交流得到了问题的真正答案——没错,就是那位朋友的意见——我立即纠正了自己的谬误并且加精。另一位朋友则在我看来十分狂妄自大,直接把我的书贬损到一无是处,对其他人也不留一点情面,我当然不爽;不过当我发现他的确有自己的学习技巧和成果的时候,我也会毫不犹豫地为他的作品鼓掌和推介,并且乐于看到更多这样确实有本事的“狂士”出现。

    什么叫做学习交流?怒吼争论吵架骂街都不怕,最终有理有据地得到共同的结论,这才是价值千金的收获,无论什么“胜败尊严”。技术的研讨有什么是挂不住面子的?有什么是别人必须给予您的?有什么是无法通过实践和思考得到的??

    这里叫做OSG论坛,不是CSDN,也不是百度知道,我绝不会把这种简单的工程配置问题一字一句地讲明白,保姆或者中学老师不是我的工作。没错,我这几年的确有一种满足感,但是您感到悲哀的恐怕并不是这一点,而是根本无力将我从这满足感中击落~~我佩服很多人,他们的技术水平和经验根本是我所不能匹敌,抑或他们对学习的执着让我只能望其项背;但我也小看许多人,他们一味只等着正确答案从天而降,他们这辈子也没有可能在技术上超过我半步——您呢?

    该用户从未签到

    发表于 2012-5-26 11:25:24 | 显示全部楼层
    顶楼上
    我自信多了

    该用户从未签到

    发表于 2012-5-26 13:28:40 | 显示全部楼层
    阿威 发表于 2012-5-26 11:25
    顶楼上
    我自信多了

    威哥都回帖了
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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

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

    联系我们

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