Harus dengan 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  my_input_layout;  HRESULT hr = m_Device->CreateInputLayout(   VertexPositionColorTexture::InputElements,        VertexPositionColorTexture::InputElementCount,        shaderByteCode, byteCodeLength,        &my_input_layout        ); m_DevContext->IASetInputLayout( my_input_layout.Get() );

ComPtr adalah smart pointer dari namespace : Microsoft::WRL::ComPtr (header : #include ) , 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

comments powered by Disqus