次のコードは、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 ) ?