layers: Add constructors for layer_data
diff --git a/layers/device_limits.cpp b/layers/device_limits.cpp
index 30e57d4..37ad695 100644
--- a/layers/device_limits.cpp
+++ b/layers/device_limits.cpp
@@ -52,11 +52,16 @@
 #include "vk_layer_extension_utils.h"
 #include "vk_layer_utils.h"
 
-typedef struct _layer_data {
+struct layer_data {
     debug_report_data *report_data;
     // TODO: put instance data here
     VkDbgMsgCallback logging_callback;
-} layer_data;
+
+    layer_data() :
+        report_data(nullptr),
+        logging_callback(nullptr)
+    {};
+};
 
 static std::unordered_map<void *, layer_data *> layer_data_map;
 static device_table_map device_limits_device_table_map;
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index 915b940..5a6d121 100644
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -50,11 +50,16 @@
 #include "vk_layer_logging.h"
 #include "vk_layer_extension_utils.h"
 
-typedef struct _layer_data {
+struct layer_data {
     debug_report_data *report_data;
     // TODO: put instance data here
     VkDbgMsgCallback logging_callback;
-} layer_data;
+
+    layer_data() :
+        report_data(nullptr),
+        logging_callback(nullptr)
+    {};
+};
 
 static std::unordered_map<void *, layer_data *> layer_data_map;
 static device_table_map draw_state_device_table_map;
diff --git a/layers/image.cpp b/layers/image.cpp
index c3ff045..d58f1a7 100644
--- a/layers/image.cpp
+++ b/layers/image.cpp
@@ -46,12 +46,18 @@
 
 using namespace std;
 
-typedef struct _layer_data {
+struct layer_data {
     debug_report_data *report_data;
     VkDbgMsgCallback logging_callback;
     VkPhysicalDevice physicalDevice;
     unordered_map<uint64_t, unique_ptr<IMAGE_STATE>> imageMap;
-} layer_data;
+
+    layer_data() :
+        report_data(nullptr),
+        logging_callback(nullptr),
+        physicalDevice(0)
+    {};
+};
 
 static unordered_map<void*, layer_data*> layer_data_map;
 static device_table_map image_device_table_map;
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp
index 36574f6..f42b686 100644
--- a/layers/mem_tracker.cpp
+++ b/layers/mem_tracker.cpp
@@ -50,12 +50,18 @@
 // Object value will be used to identify them internally.
 static const VkDeviceMemory MEMTRACKER_SWAP_CHAIN_IMAGE_KEY = static_cast<VkDeviceMemory>(-1);
 
-typedef struct _layer_data {
+struct layer_data {
     debug_report_data *report_data;
     // TODO: put instance data here
     VkDbgMsgCallback logging_callback;
     bool wsi_enabled;
-} layer_data;
+
+    layer_data() :
+        report_data(nullptr),
+        logging_callback(nullptr),
+        wsi_enabled(false)
+    {};
+};
 
 static unordered_map<void *, layer_data *> layer_data_map;
 
diff --git a/layers/object_track.h b/layers/object_track.h
index dd26610..e7d5820 100644
--- a/layers/object_track.h
+++ b/layers/object_track.h
@@ -65,13 +65,20 @@
 typedef uint64_t (*OBJ_TRACK_GET_OBJECT_COUNT)(VkDevice);
 typedef uint64_t (*OBJ_TRACK_GET_OBJECTS_OF_TYPE_COUNT)(VkDevice, VkDbgObjectType);
 
-typedef struct _layer_data {
+struct layer_data {
     debug_report_data *report_data;
     //TODO: put instance data here
     VkDbgMsgCallback   logging_callback;
     bool wsi_enabled;
     bool objtrack_extensions_enabled;
-} layer_data;
+
+    layer_data() :
+        report_data(nullptr),
+        logging_callback(nullptr),
+        wsi_enabled(false),
+        objtrack_extensions_enabled(false)
+    {};
+};
 
 struct instExts {
     bool wsi_enabled;
diff --git a/layers/param_checker.cpp b/layers/param_checker.cpp
index 0b6909d..7c8d6c7 100644
--- a/layers/param_checker.cpp
+++ b/layers/param_checker.cpp
@@ -45,10 +45,15 @@
 #include "vk_layer_logging.h"
 #include "vk_layer_extension_utils.h"
 
-typedef struct _layer_data {
+struct layer_data {
     debug_report_data *report_data;
     VkDbgMsgCallback logging_callback;
-} layer_data;
+
+    layer_data() :
+        report_data(nullptr),
+        logging_callback(nullptr)
+    {};
+};
 
 static std::unordered_map<void*, layer_data*> layer_data_map;
 static device_table_map pc_device_table_map;
diff --git a/layers/shader_checker.cpp b/layers/shader_checker.cpp
index 41d10b1..6146b94 100644
--- a/layers/shader_checker.cpp
+++ b/layers/shader_checker.cpp
@@ -47,11 +47,16 @@
 #include "spirv/spirv.hpp"
 
 
-typedef struct _layer_data {
+struct layer_data {
     debug_report_data *report_data;
     // TODO: put instance data here
     VkDbgMsgCallback logging_callback;
-} layer_data;
+
+    layer_data() :
+        report_data(nullptr),
+        logging_callback(nullptr)
+    {};
+};
 
 static std::unordered_map<void *, layer_data *> layer_data_map;
 static device_table_map shader_checker_device_table_map;
diff --git a/layers/swapchain.cpp b/layers/swapchain.cpp
index bfcd2ab..a36854b 100644
--- a/layers/swapchain.cpp
+++ b/layers/swapchain.cpp
@@ -145,7 +145,7 @@
         // Turn on logging, since it was requested:
         option_str = getLayerOption("SwapchainLogFilename");
         log_output = getLayerLogOutput(option_str, "Swapchain");
-        layer_create_msg_callback(&mydata.report_data, report_flags,
+        layer_create_msg_callback(mydata.report_data, report_flags,
                                   log_callback, (void *) log_output,
                                   &mydata.logging_callback);
     }
@@ -351,7 +351,6 @@
         if (deviceMap[device].pPresentModes) {
             free(deviceMap[device].pPresentModes);
         }
-        deviceMap.erase(device);
         if (!pDevice->swapchains.empty()) {
             LOG_ERROR(VK_OBJECT_TYPE_DEVICE, device, "VkDevice",
                       SWAPCHAIN_DEL_DEVICE_BEFORE_SWAPCHAINS,
@@ -366,6 +365,7 @@
             }
             pDevice->swapchains.clear();
         }
+        deviceMap.erase(device);
     }
 }
 
@@ -657,7 +657,7 @@
                 }
             }
             // Log the message that we've built up:
-            skipCall |= debug_report_log_msg(&mydata.report_data,
+            skipCall |= debug_report_log_msg(mydata.report_data,
                                              VK_DBG_REPORT_ERROR_BIT,
                                              VK_OBJECT_TYPE_DEVICE,
                                              (uint64_t) device, 0, 
@@ -1104,12 +1104,12 @@
 
 VK_LAYER_EXPORT VkResult VKAPI vkDbgCreateMsgCallback(VkInstance instance, VkFlags msgFlags, const PFN_vkDbgMsgCallback pfnMsgCallback, void* pUserData, VkDbgMsgCallback* pMsgCallback)
 {
-    return layer_create_msg_callback(&mydata.report_data, msgFlags, pfnMsgCallback, pUserData, pMsgCallback);
+    return layer_create_msg_callback(mydata.report_data, msgFlags, pfnMsgCallback, pUserData, pMsgCallback);
 }
 
 VK_LAYER_EXPORT VkResult VKAPI vkDbgDestroyMsgCallback(VkInstance instance, VkDbgMsgCallback msgCallback)
 {
-    layer_destroy_msg_callback(&mydata.report_data, msgCallback);
+    layer_destroy_msg_callback(mydata.report_data, msgCallback);
     return VK_SUCCESS;
 }
 
diff --git a/layers/swapchain.h b/layers/swapchain.h
index 8414d47..9a33628 100644
--- a/layers/swapchain.h
+++ b/layers/swapchain.h
@@ -65,21 +65,27 @@
 
 
 // The following is for logging error messages:
-typedef struct _layer_data {
-    debug_report_data report_data;
+struct layer_data {
+    debug_report_data *report_data;
     VkDbgMsgCallback logging_callback;
-} layer_data;
+
+    layer_data() :
+        report_data(nullptr),
+        logging_callback(nullptr)
+    {};
+};
+
 #define LAYER_NAME (char *) "Swapchain"
 #define LOG_ERROR_NON_VALID_OBJ(objType, type, obj)                     \
-    log_msg(&mydata.report_data, VK_DBG_REPORT_ERROR_BIT, (objType),    \
+    log_msg(mydata.report_data, VK_DBG_REPORT_ERROR_BIT, (objType),    \
             (uint64_t) (obj), 0, SWAPCHAIN_INVALID_HANDLE, LAYER_NAME,  \
             "%s() called with a non-valid %s.", __FUNCTION__, (obj))
 
 #define LOG_ERROR(objType, type, obj, enm, fmt, ...)                    \
-    log_msg(&mydata.report_data, VK_DBG_REPORT_ERROR_BIT, (objType),    \
+    log_msg(mydata.report_data, VK_DBG_REPORT_ERROR_BIT, (objType),    \
             (uint64_t) (obj), 0, (enm), LAYER_NAME, (fmt), __VA_ARGS__)
 #define LOG_PERF_WARNING(objType, type, obj, enm, fmt, ...)             \
-    log_msg(&mydata.report_data, VK_DBG_REPORT_PERF_WARN_BIT, (objType), \
+    log_msg(mydata.report_data, VK_DBG_REPORT_PERF_WARN_BIT, (objType), \
             (uint64_t) (obj), 0, (enm), LAYER_NAME, (fmt), __VA_ARGS__)
 
 
diff --git a/layers/threading.h b/layers/threading.h
index 367679c..5335578 100644
--- a/layers/threading.h
+++ b/layers/threading.h
@@ -34,10 +34,15 @@
     THREADING_CHECKER_SINGLE_THREAD_REUSE,              // Object used simultaneously by recursion in single thread
 } THREADING_CHECKER_ERROR;
 
-typedef struct _layer_data {
+struct layer_data {
     debug_report_data *report_data;
     VkDbgMsgCallback   logging_callback;
-} layer_data;
+
+    layer_data() :
+        report_data(nullptr),
+        logging_callback(nullptr)
+    {};
+};
 
 static std::unordered_map<void*, layer_data *> layer_data_map;
 static device_table_map                        Threading_device_table_map;