这会导致内存泄漏吗?在函数调用中分配新对象

时间:2013-05-16 13:12:26

标签: c++ memory-leaks

以下代码来自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)?

2 个答案:

答案 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会在没有您当前评论的删除的情况下泄漏。