工作日志2006.11.2

2006-11-2

       1终于找到 Turtle Odyssey 工程中的关卡编辑器 Level Editor的内存泄露地方!泄露居然发生在 hgeResourceManagerEx 中!我单独测试了这个类,尤其是 GetHFlipSprite函数,它会根据传进来的 hgeSprite 对象创建与之水平翻转的新的 hgeSprite 对象。在 ~hgeResourceMangerEx 这个解析函数中-----我用了 std::list 来存储所有创建的翻转 hgeSprite对象---我这样删除这些对象的:

for( list<hgeSprite*>::iterator i = m_flipSpContainer.begin(); i != m_flipSpContainer.end(); ++ i )

{

     m_hge->Texture_Free( (*i)->GetTexture() );

     delete (*i);

 

     i = m_flipSpContainer.erase( i );

}

     测试程序创建了四幅翻转纹理,对应了四个hgeSprite对象。但是根据跟踪调试,发现以上循环只循环了两次!然后使用VC来查找内存泄露,正好发生了两次泄露!去掉 i = m_flipSpContainer.erase( i );

后,一切就正常了,内存泄露就解决了!

        

     2.不要写内联虚函数。由于虚函数的存在,编译器会去创建一个虚函数表,如果让虚函数成为内联函数,则会在工程中创建大量的这个表。具体可以参看< More Effective C++ >条款24

        在《面向对象的游戏开发》中也提到过类似的问题:P74代码注释:

         “Always put an empty virtual destructor in the cpp file . Being virtual , it won’t be inlined anyway , and some compliers have problems with virtual destructors defined, within headers ”      

         不过我觉得在很多编译器中应该会自动取消程序员在这里定义的内联属性!(事实上也是这样,即使有些函数被你定义为内联的,在编译器优化你的代码时,也会取消其内联属性)

         3.为了满足 Turtle Odyssey 的需要,我写了个基于HGE的文本按钮,该按钮的外观不使用图片,而使用 hgeFont 文字外观。

         目前该类已经通过测试。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值