以下代码摘自 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 的实例,它有一个私有(private)成员 D3DXVECTOR3 m_lookAt。 SetLookAt() 函数采用指向 D3DXVECTOR3 的指针。
我的问题是,提供此指针的方式(情况 1 和情况 2)之间有什么区别?
就我的理解而言,在情况 1 中,D3DXVECTOR 是从堆中分配的。创建的指针被传递给 SetLookAt(),它复制数据并退出。然后,Initialize() 退出,没有释放 D3DXVECTOR 占用的内存,导致内存泄漏。可能的解决方案是取消注释 SetLookAt() 中的最后一行。
在情况 2 中,D3DXVECTOR 在堆栈上分配,其地址传递给 SetLookAt。这一次,D3DXVECTOR 只有在 Initialize() 完成时才会被释放。
我的理解对吗?如果我(在情况 2 中)希望 D3DXVECTOR3 占用的内存在 SetLookAt() 函数结束后立即释放怎么办?将 SetLookAt() 包裹在大括号中(案例 3)是否足以在 SetLookAt 完成后强制释放创建的 D3DXVECTOR3?
此外,如果调用 SetLookAt()(在所有 3 种情况下),使用文字值调用 vector ,例如D3DXVECTOR3( 8.0f, 0.0f, 5.0f ) 而不是 D3DXVECTOR3( x_component, y_component, z_component ) ?
最佳答案
在这种情况下你应该使用常量引用
void CCamera::SetLookAt( const D3DXVECTOR3& lookAt )
情况2和情况3相同
创建 vector 时它的工作方式没有区别:
D3DXVECTOR ( D3DXVECTOR3( 8.0f, 0.0f, 5.0f )
或 D3DXVECTOR3( x_component, y_component, z_component )
关于c++ - 这会导致内存泄漏吗?在函数调用中分配新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16588432/