以下代码来自DirectX教程,并由我稍作修改:
void Initialize()
{
// case 1
m_camera.SetLookAt( new D3DXVECTOR3( x_component, y_component, z_component ) );
// case 2
m_camera.SetLookAt( &D3DXVECTOR3( x_component, y_component, z_component ) );
// case 3
{
m_camera.SetLookAt( &D3DXVECTOR3( x_component, y_component, z_component ) );
}
//more stuff to do here
}
void CCamera::SetLookAt( D3DXVECTOR3* pLookAt )
{
m_lookAt.x = pLookAt->x;
m_lookAt.y = pLookAt->y;
m_lookAt.z = pLookAt->z;
//delete pLookAt; // solution for case 1?
}
m_camera是类CCamera的实例,它有一个私有成员D3DXVECTOR3 m_lookAt。 SetLookAt()函数获取指向D3DXVECTOR3的指针。
我的问题是,提供此指针的方式有何不同(案例1和2)?
据我所知,在情况1中,D3DXVECTOR是从堆中分配的。创建的指针传递给SetLookAt(),后者复制数据并退出。然后,Initialize()退出,而不释放D3DXVECTOR占用的内存,导致内存泄漏。可能的解决方案是取消注释SetLookAt()中的最后一行。
在案例2中,D3DXVECTOR在堆栈上分配,其地址传递给SetLookAt。这次,只有在Initialize()完成时才释放D3DXVECTOR。
我的理解是否正确?如果我(在案例2中)想要一旦SetLookAt()函数结束就释放D3DXVECTOR3占用的内存怎么办?将SetLookAt()包装在大括号(案例3)中是否足以在SetLookAt完成后强制释放创建的D3DXVECTOR3?
此外,如果调用SetLookAt()(在所有3种情况下),将使用文字值调用向量,例如, D3DXVECTOR3(8.0f,0.0f,5.0f)代替D3DXVECTOR3(x_component,y_component,z_component)?
答案 0 :(得分:2)
在这种情况下,您应该使用const引用
void CCamera::SetLookAt( const D3DXVECTOR3& lookAt )
案例2和案例3是相同的
创建矢量时,它的工作方式没有区别:
D3DXVECTOR ( D3DXVECTOR3( 8.0f, 0.0f, 5.0f )
或D3DXVECTOR3( x_component, y_component, z_component )
答案 1 :(得分:0)
在情况2和3(它们是相同的)中,您传递指向堆栈分配的匿名临时的指针。这很好,因为堆栈在函数有效之前不会放松 返回,这样你的指针就会保持有效。
匿名临时从堆栈中弹出一次.SetLookAt已经完成,在2和3中都是这样,这就是为什么{}是多余的。
案例1会在没有您当前评论的删除的情况下泄漏。