DXUT 怎样释放类中的COM对象该?

千分散尽还复来 2012-07-03 04:06:49

我想把某些网格体、效果、纹理封装在一个类CObject中,头文件中是这样定义这个类的:
class CObject
{
public:
CObject ();
~CObject () ;
void OnCreateDevice() ;
HRESULT OnRender( LPDIRECT3DDEVICE9 pDevice) ;
void OnLostDevice() ;
void OnResetDevice() ;
void OnDestroyDevice() ;
private:
LPD3DXMESH m_pMesh ;
LPDIRECT3DTEXTURE9 m_pTexture ;
LPD3DXEFFECT m_pEffect;
};
/////////////////////////////////////////////////////////////////////
.cpp文件大体是这样的:
CObject::CObject()
{
}
CObject::~CObject()
{
}
void CObject::OnCreateDevice()
{
//创建网格、纹理、效果接口的引用
}
HRESULT CObject::OnRender( LPDIRECT3DDEVICE9 pDevice)
{
//使用效果和纹理接口渲染网格体对象
}
void CObject::OnResetDevice()
{
//
}
void CObject::OnLostDevice()
{
//
}
void CObject::OnDestroyDevice()
{
SAFE_RELEASE(m_pTexture);
SAFE_RELEASE(m_pEffect);
SAFE_RELEASE(m_pMesh);
}

程序运行时一切正常,但关闭以后,总提示有内存未被释放。大体是这样的提示:
D3DX: MEMORY LEAKS DETECTED: 12 allocations unfreed (131440 bytes)

到底该怎样释放这些内存?析构函数中删除它们也不行,提示依旧。
请过往大侠们指点一下,谢谢!
...全文
258 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
antiMight 2012-07-04
  • 打赏
  • 举报
回复
可以试试直接release三个资源,如果结果一样,可以逐个排查,试试二次release同一对象,如果不崩溃,说明你该对象引用计数大于1,可以看看有没有额外引用的情况。再者可能有临时COM对象忘记release()?一些Get*函数会生成对象的,此类对象也应Release
  • 打赏
  • 举报
回复
SAFE_RELEASE宏就是释放它们的;
DXUT的框架也就是在程序级别下的一个叫做OnDestroyDevice()的回调函数中释放它们,类中的那个OnDestroyDevice()函数也正是在程序级别的OnDestroyDevice()函数中调用 ;

如果不是在类中创建的接口,释放都很干净,就是封装到类里面就有问题了。

谢谢!
一叶之舟 2012-07-03
  • 打赏
  • 举报
回复
COM对象每次引用完就必须调用一次Release()方法。

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧