Smart pointer.
Simple tips, tetapi sangat critical : Ada suatu keadaan dimana kita harus memakai smart pointer ! , Kapan?, salah satunya jika berurusan dengan DirectX API 11 . lihat salah satu contoh dibawah ini :
HRESULT CreateInputLayout( [in] const D3D11_INPUT_ELEMENT_DESC *pInputElementDescs, [in] vUINT NumElements, [in] const void *pShaderBytecodeWithInputSignature, [in] SIZE_T BytecodeLength, [out] ID3D11InputLayout **ppInputLayout );
parameter ke-5 fungsi diatas mengharapkan variabel pointer to pointer. Kalau kita memakai raw pointer, bisa juga, seperti dibawah ini : ID3D11InputLayout* my_input_layout ; HRESULT hr = m_Device->CreateInputLayout( VertexPositionColorTexture::InputElements, VertexPositionColorTexture::InputElementCount, shaderByteCode, byteCodeLength, & my_input_layout ); m_DeviceContext->IASetInputLayout( my_input_layout );
Tetapi ada masalah dengan kode diatas: terjadi memory leak, karena tidak ada yang men-delete variabel my_input_layout. Bagaimana jika di delete manual setelah m_DeviceContext->IASetInputLayout( my_input_layout ); ?, program akan crash, karena data masih digunakan dan kita belum tau kapan itu selsai dipakai. Untuk mengatasi ini , kita bisa memakai ComPtr. Cara yang benar tanpa memory leak :
ComPtr
ComPtr adalah smart pointer dari namespace : Microsoft::WRL::ComPtr (header : #include <wrl\client.h> ) , ya ini adalah smart pointer dari Microsoft. saya mencoba mengganti dengan std::shared_ptr (STD smart pointer) , sayangnya tidak ada overload operator “&” disana. atau dengan kata lain, kita harus memakai Comptr jika berurusan dengan manajemen DirectX resource. #BasedOnReal headache mencari memory leak