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

标签 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 的实例,它有一个私有(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/

相关文章:

c++ - CMake 单元测试 - 未解析的外部符号

c++ - 3D 球体和在 OpenGL 中添加纹理

c++ - 尝试将光标夹到我的窗口不起作用?

java - 表中 SWT Combo 的性能不佳

multithreading - 线程中的 Perl 内存泄漏(线程不释放内存)

c++ - int 值通常什么时候转换为 unsigned?

c++ - 尝试使用 C++ 中的 OpenCV 从灰度相机渲染图像。几帧后挂起

c# - 当内存转储显示使用的内存很少时调试内存不足情况

c - 在函数中释放内存

c++ - dll加载时出错