From 2031e355cba10fc1f91cadf51faadaf7cb175db1 Mon Sep 17 00:00:00 2001 From: Gabríel Arthúr Pétursson Date: Sat, 3 Jun 2017 23:48:15 +0000 Subject: layers: Use unique_ptr for descriptor set layout map This fixes a leak where PostCallRecordDestroyDescriptorSetLayout erases from the map without calling delete on the erased element. --- layers/core_validation.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'layers/core_validation.cpp') diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index aec8d92a..3a0a893d 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -153,7 +154,7 @@ struct layer_data { unordered_map commandPoolMap; unordered_map descriptorPoolMap; unordered_map setMap; - unordered_map descriptorSetLayoutMap; + unordered_map> descriptorSetLayoutMap; unordered_map pipelineLayoutMap; unordered_map> memObjMap; unordered_map fenceMap; @@ -1844,7 +1845,7 @@ cvdescriptorset::DescriptorSetLayout const *GetDescriptorSetLayout(layer_data co if (it == dev_data->descriptorSetLayoutMap.end()) { return nullptr; } - return it->second; + return it->second.get(); } static PIPELINE_LAYOUT_NODE const *getPipelineLayout(layer_data const *dev_data, VkPipelineLayout pipeLayout) { @@ -3647,9 +3648,6 @@ VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCall deletePools(dev_data); // All sets should be removed assert(dev_data->setMap.empty()); - for (auto del_layout : dev_data->descriptorSetLayoutMap) { - delete del_layout.second; - } dev_data->descriptorSetLayoutMap.clear(); dev_data->imageViewMap.clear(); dev_data->imageMap.clear(); @@ -6072,8 +6070,8 @@ static bool PreCallValidateCreateDescriptorSetLayout(layer_data *dev_data, const static void PostCallRecordCreateDescriptorSetLayout(layer_data *dev_data, const VkDescriptorSetLayoutCreateInfo *create_info, VkDescriptorSetLayout set_layout) { - // TODO: Convert this to unique_ptr to avoid leaks - dev_data->descriptorSetLayoutMap[set_layout] = new cvdescriptorset::DescriptorSetLayout(create_info, set_layout); + dev_data->descriptorSetLayoutMap[set_layout] = std::unique_ptr( + new cvdescriptorset::DescriptorSetLayout(create_info, set_layout)); } VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo, -- cgit v1.2.3