Re: [2/2] d3dx9: Implement D3DXLoadMeshHierarchy for basic mesh hierarchy.
Hello, I found a possibly memory leak in the patch. In this function:
+static HRESULT parse_mesh(IDirectXFileData *filedata, struct mesh_data *mesh_data, DWORD provide_flags) These may leak the allocated blocks: + + mesh_data->vertices = HeapAlloc(GetProcessHeap(), 0, + mesh_data->num_vertices * sizeof(*mesh_data->vertices)); + mesh_data->num_tri_per_face = HeapAlloc(GetProcessHeap(), 0, + mesh_data->num_poly_faces * sizeof(*mesh_data->num_tri_per_face)); + mesh_data->indices = HeapAlloc(GetProcessHeap(), 0, + (mesh_data->num_tri_faces + mesh_data->num_poly_faces * 2) * sizeof(*mesh_data->indices)); + if (!mesh_data->vertices || !mesh_data->num_tri_per_face || !mesh_data->indices) + return E_OUTOFMEMORY; +
HTH, Joris
On Thu, May 19, 2011 at 6:16 AM, Joris Huizer <joris_huizer(a)yahoo.com> wrote:
Hello,
I found a possibly memory leak in the patch. In this function:
+static HRESULT parse_mesh(IDirectXFileData *filedata, struct mesh_data *mesh_data, DWORD provide_flags)
These may leak the allocated blocks:
+ + mesh_data->vertices = HeapAlloc(GetProcessHeap(), 0, + mesh_data->num_vertices * sizeof(*mesh_data->vertices)); + mesh_data->num_tri_per_face = HeapAlloc(GetProcessHeap(), 0, + mesh_data->num_poly_faces * sizeof(*mesh_data->num_tri_per_face)); + mesh_data->indices = HeapAlloc(GetProcessHeap(), 0, + (mesh_data->num_tri_faces + mesh_data->num_poly_faces * 2) * sizeof(*mesh_data->indices)); + if (!mesh_data->vertices || !mesh_data->num_tri_per_face || !mesh_data->indices) + return E_OUTOFMEMORY; +
All the pointers are stored in mesh_data, which isn't lost. They are freed at the end of load_skin_mesh_from_xof. +cleanup: + if (FAILED(hr)) { + if (d3dxmesh) IUnknown_Release(d3dxmesh); + if (adjacency) ID3DXBuffer_Release(adjacency); + } + HeapFree(GetProcessHeap(), 0, mesh_data.vertices); + HeapFree(GetProcessHeap(), 0, mesh_data.num_tri_per_face); + HeapFree(GetProcessHeap(), 0, mesh_data.indices); + return hr; +}
On 05/19/2011 06:34 PM, Dylan Smith wrote:
On Thu, May 19, 2011 at 6:16 AM, Joris Huizer<joris_huizer(a)yahoo.com> wrote:
Hello,
I found a possibly memory leak in the patch. In this function:
+static HRESULT parse_mesh(IDirectXFileData *filedata, struct mesh_data *mesh_data, DWORD provide_flags) These may leak the allocated blocks: + + mesh_data->vertices = HeapAlloc(GetProcessHeap(), 0, + mesh_data->num_vertices * sizeof(*mesh_data->vertices)); + mesh_data->num_tri_per_face = HeapAlloc(GetProcessHeap(), 0, + mesh_data->num_poly_faces * sizeof(*mesh_data->num_tri_per_face)); + mesh_data->indices = HeapAlloc(GetProcessHeap(), 0, + (mesh_data->num_tri_faces + mesh_data->num_poly_faces * 2) * sizeof(*mesh_data->indices)); + if (!mesh_data->vertices || !mesh_data->num_tri_per_face || !mesh_data->indices) + return E_OUTOFMEMORY; + All the pointers are stored in mesh_data, which isn't lost. They are freed at the end of load_skin_mesh_from_xof.
+cleanup: + if (FAILED(hr)) { + if (d3dxmesh) IUnknown_Release(d3dxmesh); + if (adjacency) ID3DXBuffer_Release(adjacency); + } + HeapFree(GetProcessHeap(), 0, mesh_data.vertices); + HeapFree(GetProcessHeap(), 0, mesh_data.num_tri_per_face); + HeapFree(GetProcessHeap(), 0, mesh_data.indices); + return hr; +}
Thanks for clarification (Sorry for the noise)
participants (2)
-
Dylan Smith -
Joris Huizer