nvidia-gpu: Fix a number of object lifetime issues

Moves all subsensors and objects treated as shared_ptrs
to be using shared_from_this. This way, if there's an object lifetime
issue we don't segfault.

Also separates construction and asio init for NvidiaSmaDevice
so that when we bind to this, its valid after we leave the ctor

Change-Id: I8e3115bc276d2e0eaac0b1dc9a9d2c46e6751d4b
Signed-off-by: Marc Olberding <molberding@nvidia.com>
diff --git a/src/nvidia-gpu/NvidiaDeviceDiscovery.cpp b/src/nvidia-gpu/NvidiaDeviceDiscovery.cpp
index 9afb000..07b81f1 100644
--- a/src/nvidia-gpu/NvidiaDeviceDiscovery.cpp
+++ b/src/nvidia-gpu/NvidiaDeviceDiscovery.cpp
@@ -106,9 +106,13 @@
             auto smaName = configs.name + "_SMA_" +
                            std::to_string(responseInstanceId);
 
-            smaDevices[smaName] =
-                std::make_shared<SmaDevice>(configs, smaName, path, conn, eid,
-                                            io, mctpRequester, objectServer);
+            auto sma = smaDevices
+                           .insert(std::make_pair(
+                               smaName, std::make_shared<SmaDevice>(
+                                            configs, smaName, path, conn, eid,
+                                            io, mctpRequester, objectServer)))
+                           .first;
+            (*sma).second->init();
             break;
         }
     }