0

次のコードは、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 は、プライベート メンバ D3DXVECTOR3 m_lookAt を持つクラス CCamera のインスタンスです。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( x_component, y_component, z_component ) ?

4

2 に答える 2

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 )

于 2013-05-16T13:14:27.440 に答える
0

ケース 2 と 3 (どちらも同じ) では、スタックに割り当てられた匿名のテンポラリへのポインターを渡しています。関数が返されるまでスタックは巻き戻されないため、ポインタは有効なままなので問題ありません。

2 と 3 の両方で .SetLookAt が完了すると、匿名のテンポラリがスタックからポップされます。これが、{} が冗長である理由です。

ケース1は、現在コメントしている削除なしでリークします。

于 2013-05-16T13:15:58.090 に答える