在指南里有一个关于mesh得例子,里面在cleanup得时候有这样得代码:
if( g_pMeshMaterials != NULL )
delete[] g_pMeshMaterials;
if( g_pMeshTextures )
{
for( DWORD i = 0; i < g_dwNumMaterials; i++ )
{
if( g_pMeshTextures[i] )
g_pMeshTextures[i]->Release();
}
delete[] g_pMeshTextures;
}
上面删除材质对象直接delete就ok了,但是在删除纹理对象得对象得时候,为什么还要用循环先release后才delete呀,材质对象为什么不先release那?请那位大虾指点一‘二
g_pMeshTextures是按指针申请的,动态创建完后,被分配空间,Release不能释放这些空间,而只是告诉系统这些Com对象没有用了而已,空间的释放交给delete来做了
就是,Release跟delete做的是不同的事,DirectX是用COM搭起来的,当你创建一个对象时,记数器就会加1,这个加1经常是内部自己做的,当对象不用了,就要用Release()使记数器减1,这个一般是要程序员自己做的
COM对象有一对方法:AddRef和Release
是用于增加和减少引用计数的
因为COM对象往往可能在多处被引用
这样做是为了为了避免重复释放指针的错误
当引用计数被Release()减到0,就可以释放指针了