layers: Store layout bindings_ by value instead of ptr

Kill the ptr to safe_VkDescriptorSetLayoutBinding in DescriptorSetLayout
class. This saves us the "new" and the need for a custom destructor.
Couldn't do this initially but I've since added copy constructors
to all of the safe_* struct types.
diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp
index 420b3c8..9704bed 100644
--- a/layers/descriptor_sets.cpp
+++ b/layers/descriptor_sets.cpp
@@ -41,12 +41,12 @@
         global_index += p_create_info->pBindings[i].descriptorCount ? p_create_info->pBindings[i].descriptorCount - 1 : 0;
         binding_to_global_end_index_map_[p_create_info->pBindings[i].binding] = global_index;
         global_index++;
-        bindings_.push_back(new safe_VkDescriptorSetLayoutBinding(&p_create_info->pBindings[i]));
+        bindings_.push_back(safe_VkDescriptorSetLayoutBinding(&p_create_info->pBindings[i]));
         // In cases where we should ignore pImmutableSamplers make sure it's NULL
         if ((p_create_info->pBindings[i].pImmutableSamplers) &&
             ((p_create_info->pBindings[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) &&
              (p_create_info->pBindings[i].descriptorType != VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER))) {
-            bindings_.back()->pImmutableSamplers = nullptr;
+            bindings_.back().pImmutableSamplers = nullptr;
         }
         if (p_create_info->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC ||
             p_create_info->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC) {
@@ -54,10 +54,6 @@
         }
     }
 }
-cvdescriptorset::DescriptorSetLayout::~DescriptorSetLayout() {
-    for (auto binding : bindings_)
-        delete binding;
-}
 // put all bindings into the given set
 void cvdescriptorset::DescriptorSetLayout::FillBindingSet(std::unordered_set<uint32_t> *binding_set) const {
     for (auto binding_index_pair : binding_to_index_map_)
@@ -67,7 +63,7 @@
 cvdescriptorset::DescriptorSetLayout::GetDescriptorSetLayoutBindingPtrFromBinding(const uint32_t binding) const {
     const auto &bi_itr = binding_to_index_map_.find(binding);
     if (bi_itr != binding_to_index_map_.end()) {
-        return bindings_[bi_itr->second]->ptr();
+        return bindings_[bi_itr->second].ptr();
     }
     return nullptr;
 }
@@ -75,13 +71,13 @@
 cvdescriptorset::DescriptorSetLayout::GetDescriptorSetLayoutBindingPtrFromIndex(const uint32_t index) const {
     if (index >= bindings_.size())
         return nullptr;
-    return bindings_[index]->ptr();
+    return bindings_[index].ptr();
 }
 // Return descriptorCount for given binding, 0 if index is unavailable
 uint32_t cvdescriptorset::DescriptorSetLayout::GetDescriptorCountFromBinding(const uint32_t binding) const {
     const auto &bi_itr = binding_to_index_map_.find(binding);
     if (bi_itr != binding_to_index_map_.end()) {
-        return bindings_[bi_itr->second]->descriptorCount;
+        return bindings_[bi_itr->second].descriptorCount;
     }
     return 0;
 }
@@ -89,30 +85,30 @@
 uint32_t cvdescriptorset::DescriptorSetLayout::GetDescriptorCountFromIndex(const uint32_t index) const {
     if (index >= bindings_.size())
         return 0;
-    return bindings_[index]->descriptorCount;
+    return bindings_[index].descriptorCount;
 }
 // For the given binding, return descriptorType
 VkDescriptorType cvdescriptorset::DescriptorSetLayout::GetTypeFromBinding(const uint32_t binding) const {
     assert(binding_to_index_map_.count(binding));
     const auto &bi_itr = binding_to_index_map_.find(binding);
     if (bi_itr != binding_to_index_map_.end()) {
-        return bindings_[bi_itr->second]->descriptorType;
+        return bindings_[bi_itr->second].descriptorType;
     }
     return VK_DESCRIPTOR_TYPE_MAX_ENUM;
 }
 // For the given index, return descriptorType
 VkDescriptorType cvdescriptorset::DescriptorSetLayout::GetTypeFromIndex(const uint32_t index) const {
     assert(index < bindings_.size());
-    return bindings_[index]->descriptorType;
+    return bindings_[index].descriptorType;
 }
 // For the given global index, return descriptorType
 //  Currently just counting up through bindings_, may improve this in future
 VkDescriptorType cvdescriptorset::DescriptorSetLayout::GetTypeFromGlobalIndex(const uint32_t index) const {
     uint32_t global_offset = 0;
     for (auto binding : bindings_) {
-        global_offset += binding->descriptorCount;
+        global_offset += binding.descriptorCount;
         if (index < global_offset)
-            return binding->descriptorType;
+            return binding.descriptorType;
     }
     assert(0); // requested global index is out of bounds
     return VK_DESCRIPTOR_TYPE_MAX_ENUM;
@@ -122,7 +118,7 @@
     assert(binding_to_index_map_.count(binding));
     const auto &bi_itr = binding_to_index_map_.find(binding);
     if (bi_itr != binding_to_index_map_.end()) {
-        return bindings_[bi_itr->second]->stageFlags;
+        return bindings_[bi_itr->second].stageFlags;
     }
     return VkShaderStageFlags(0);
 }
@@ -151,14 +147,14 @@
     assert(binding_to_index_map_.count(binding));
     const auto &bi_itr = binding_to_index_map_.find(binding);
     if (bi_itr != binding_to_index_map_.end()) {
-        return bindings_[bi_itr->second]->pImmutableSamplers;
+        return bindings_[bi_itr->second].pImmutableSamplers;
     }
     return nullptr;
 }
 // For given index, return ptr to ImmutableSampler array
 VkSampler const *cvdescriptorset::DescriptorSetLayout::GetImmutableSamplerPtrFromIndex(const uint32_t index) const {
     assert(index < bindings_.size());
-    return bindings_[index]->pImmutableSamplers;
+    return bindings_[index].pImmutableSamplers;
 }
 // If our layout is compatible with rh_ds_layout, return true,
 //  else return false and fill in error_msg will description of what causes incompatibility
@@ -178,29 +174,28 @@
     for (auto binding : bindings_) {
         // TODO : Do we also need to check immutable samplers?
         // VkDescriptorSetLayoutBinding *rh_binding;
-        // rh_ds_layout->FillDescriptorSetLayoutBindingStructFromBinding(binding->binding, rh_binding);
-        if (binding->descriptorCount != rh_ds_layout->GetDescriptorCountFromBinding(binding->binding)) {
+        if (binding.descriptorCount != rh_ds_layout->GetDescriptorCountFromBinding(binding.binding)) {
             std::stringstream error_str;
-            error_str << "Binding " << binding->binding << " for DescriptorSetLayout " << layout_ << " has a descriptorCount of "
-                      << binding->descriptorCount << " but binding " << binding->binding << " for DescriptorSetLayout "
+            error_str << "Binding " << binding.binding << " for DescriptorSetLayout " << layout_ << " has a descriptorCount of "
+                      << binding.descriptorCount << " but binding " << binding.binding << " for DescriptorSetLayout "
                       << rh_ds_layout->GetDescriptorSetLayout() << " has a descriptorCount of "
-                      << rh_ds_layout->GetDescriptorCountFromBinding(binding->binding);
+                      << rh_ds_layout->GetDescriptorCountFromBinding(binding.binding);
             *error_msg = error_str.str();
             return false;
-        } else if (binding->descriptorType != rh_ds_layout->GetTypeFromBinding(binding->binding)) {
+        } else if (binding.descriptorType != rh_ds_layout->GetTypeFromBinding(binding.binding)) {
             std::stringstream error_str;
-            error_str << "Binding " << binding->binding << " for DescriptorSetLayout " << layout_ << " is type '"
-                      << string_VkDescriptorType(binding->descriptorType) << "' but binding " << binding->binding
+            error_str << "Binding " << binding.binding << " for DescriptorSetLayout " << layout_ << " is type '"
+                      << string_VkDescriptorType(binding.descriptorType) << "' but binding " << binding.binding
                       << " for DescriptorSetLayout " << rh_ds_layout->GetDescriptorSetLayout() << " is type '"
-                      << string_VkDescriptorType(rh_ds_layout->GetTypeFromBinding(binding->binding)) << "'";
+                      << string_VkDescriptorType(rh_ds_layout->GetTypeFromBinding(binding.binding)) << "'";
             *error_msg = error_str.str();
             return false;
-        } else if (binding->stageFlags != rh_ds_layout->GetStageFlagsFromBinding(binding->binding)) {
+        } else if (binding.stageFlags != rh_ds_layout->GetStageFlagsFromBinding(binding.binding)) {
             std::stringstream error_str;
-            error_str << "Binding " << binding->binding << " for DescriptorSetLayout " << layout_ << " has stageFlags "
-                      << binding->stageFlags << " but binding " << binding->binding << " for DescriptorSetLayout "
+            error_str << "Binding " << binding.binding << " for DescriptorSetLayout " << layout_ << " has stageFlags "
+                      << binding.stageFlags << " but binding " << binding.binding << " for DescriptorSetLayout "
                       << rh_ds_layout->GetDescriptorSetLayout() << " has stageFlags "
-                      << rh_ds_layout->GetStageFlagsFromBinding(binding->binding);
+                      << rh_ds_layout->GetStageFlagsFromBinding(binding.binding);
             *error_msg = error_str.str();
             return false;
         }
@@ -215,12 +210,12 @@
     if (bi_itr != binding_to_index_map_.end()) {
         const auto &next_bi_itr = binding_to_index_map_.find(binding + 1);
         if (next_bi_itr != binding_to_index_map_.end()) {
-            auto type = bindings_[bi_itr->second]->descriptorType;
-            auto stage_flags = bindings_[bi_itr->second]->stageFlags;
-            auto immut_samp = bindings_[bi_itr->second]->pImmutableSamplers ? true : false;
-            if ((type != bindings_[next_bi_itr->second]->descriptorType) ||
-                (stage_flags != bindings_[next_bi_itr->second]->stageFlags) ||
-                (immut_samp != (bindings_[next_bi_itr->second]->pImmutableSamplers ? true : false))) {
+            auto type = bindings_[bi_itr->second].descriptorType;
+            auto stage_flags = bindings_[bi_itr->second].stageFlags;
+            auto immut_samp = bindings_[bi_itr->second].pImmutableSamplers ? true : false;
+            if ((type != bindings_[next_bi_itr->second].descriptorType) ||
+                (stage_flags != bindings_[next_bi_itr->second].stageFlags) ||
+                (immut_samp != (bindings_[next_bi_itr->second].pImmutableSamplers ? true : false))) {
                 return false;
             }
             return true;