diff --git a/SDK/C++/private/feed_impl.hpp b/SDK/C++/private/feed_impl.hpp
index 5cb9745b87942f21c246a4de3828bbee0fd15737..ba0ab72d7d43eebaa03c5794b76d2b762e507706 100644
--- a/SDK/C++/private/feed_impl.hpp
+++ b/SDK/C++/private/feed_impl.hpp
@@ -13,7 +13,7 @@ class InputFeedImpl : public voltu::Feed
 {
 public:
 	InputFeedImpl(ftl::stream::Feed*, uint32_t fsid);
-	~InputFeedImpl();
+	~InputFeedImpl() override;
 	
 	std::string getURI() override;
 
@@ -34,7 +34,7 @@ class OutputFeedImpl : public voltu::Feed
 {
 public:
 	OutputFeedImpl(ftl::stream::Feed*, const std::string &uri);
-	~OutputFeedImpl();
+	~OutputFeedImpl() override;
 	
 	std::string getURI() override;
 
diff --git a/SDK/C++/private/frame_impl.hpp b/SDK/C++/private/frame_impl.hpp
index 98566e602f0cba2c1e1ba413328935d85e7eb455..1b6074a8a6cc1c23dd9e317c09cf1a5596bd467c 100644
--- a/SDK/C++/private/frame_impl.hpp
+++ b/SDK/C++/private/frame_impl.hpp
@@ -14,7 +14,7 @@ class FrameImpl : public voltu::Frame
 {
 public:
 	FrameImpl();
-	~FrameImpl();
+	~FrameImpl() override;
 
 	std::list<voltu::ImagePtr> getImageSet(voltu::Channel) override;
 
diff --git a/SDK/C++/private/image_impl.hpp b/SDK/C++/private/image_impl.hpp
index 189a1c19fd13366e8728a50494a6ee9b1e2c4c5f..ac9a33c46cfb9211ab7d9896b65971b6a550e952 100644
--- a/SDK/C++/private/image_impl.hpp
+++ b/SDK/C++/private/image_impl.hpp
@@ -12,7 +12,7 @@ class ImageImpl : public voltu::Image
 {
 public:
 	ImageImpl(const ftl::rgbd::Frame&, ftl::codecs::Channel c);
-	~ImageImpl();
+	~ImageImpl() override;
 
 	voltu::ImageData getHost() override;
 
diff --git a/SDK/C++/private/observer_impl.cpp b/SDK/C++/private/observer_impl.cpp
index 325d24cf39eb8a0a32e5390f6ef0c84a5ab4a7f8..49563417c0b45d8814d8e99b4379a6f15ece2ab8 100644
--- a/SDK/C++/private/observer_impl.cpp
+++ b/SDK/C++/private/observer_impl.cpp
@@ -28,7 +28,8 @@ ObserverImpl::ObserverImpl(ftl::Configurable *base)
 
 ObserverImpl::~ObserverImpl()
 {
-
+	delete rend_;
+	delete pool_;
 }
 
 void ObserverImpl::setResolution(uint32_t w, uint32_t h)
diff --git a/SDK/C++/private/observer_impl.hpp b/SDK/C++/private/observer_impl.hpp
index 817e2babdb45b2beb23380f7b6e4ee20ca7e87c2..dfccf7e59476ffd405e3a222b3e41e5d30d1f58a 100644
--- a/SDK/C++/private/observer_impl.hpp
+++ b/SDK/C++/private/observer_impl.hpp
@@ -17,7 +17,7 @@ class ObserverImpl : public voltu::Observer
 public:
 	explicit ObserverImpl(ftl::Configurable *base);
 
-	~ObserverImpl();
+	~ObserverImpl() override;
 
 	void setResolution(uint32_t w, uint32_t h) override;
 
diff --git a/SDK/C++/private/operator_impl.hpp b/SDK/C++/private/operator_impl.hpp
index cdbfff19b4a78c87ed45ee935ccbb173e523f27c..cfe5d26ab0f24d1dafeb8fec2f0c1d4ea67b5fac 100644
--- a/SDK/C++/private/operator_impl.hpp
+++ b/SDK/C++/private/operator_impl.hpp
@@ -14,7 +14,7 @@ class OperatorImpl : public voltu::Operator
 {
 public:
 	OperatorImpl(ftl::Configurable*);
-	~OperatorImpl();
+	~OperatorImpl() override;
 
 	voltu::PropertyPtr property(const std::string &name) override;
 
diff --git a/SDK/C++/private/pipeline_impl.hpp b/SDK/C++/private/pipeline_impl.hpp
index 6764e5d19309a6f96fec496850c07568960b70b7..98fe41c9018fe328c1cb296e3819d052a8808a73 100644
--- a/SDK/C++/private/pipeline_impl.hpp
+++ b/SDK/C++/private/pipeline_impl.hpp
@@ -12,7 +12,7 @@ class PipelineImpl : public voltu::Pipeline
 {
 public:
 	PipelineImpl(ftl::Configurable *root);
-	~PipelineImpl();
+	~PipelineImpl() override;
 
 	void submit(const voltu::FramePtr &frame) override;
 
diff --git a/SDK/C++/private/room_impl.cpp b/SDK/C++/private/room_impl.cpp
index 9df583c86610ecfeb4c0140ee659201ba76a1f29..76ab1b92bad65d098c8a0f2a34685edc9219e458 100644
--- a/SDK/C++/private/room_impl.cpp
+++ b/SDK/C++/private/room_impl.cpp
@@ -11,6 +11,11 @@ RoomImpl::RoomImpl(ftl::stream::Feed* feed)
 
 }
 
+RoomImpl::~RoomImpl()
+{
+	if (filter_) filter_->remove();
+}
+
 bool RoomImpl::waitNextFrame(int64_t timeout)
 {
 	if (!filter_)
diff --git a/SDK/C++/private/room_impl.hpp b/SDK/C++/private/room_impl.hpp
index 6c57dfcbb499c32f487d952c7b021da3ce148faa..be8516a637b316c9a3964b14952f11fcadd23459 100644
--- a/SDK/C++/private/room_impl.hpp
+++ b/SDK/C++/private/room_impl.hpp
@@ -13,6 +13,8 @@ class RoomImpl : public voltu::Room
 {
 public:
 	explicit RoomImpl(ftl::stream::Feed*);
+	
+	~RoomImpl() override;
 
 	bool waitNextFrame(int64_t) override;
 
diff --git a/SDK/C++/private/system.cpp b/SDK/C++/private/system.cpp
index a84d579eba394b94a1b3f7e4d62bdb992a1654a6..b93a4bdc621dae6268032fa6525a6bca89b383d5 100644
--- a/SDK/C++/private/system.cpp
+++ b/SDK/C++/private/system.cpp
@@ -45,7 +45,11 @@ SystemImpl::SystemImpl()
 SystemImpl::~SystemImpl()
 {
 	ftl::timer::stop(true);
+	net_->shutdown();
 	ftl::pool.stop(true);
+	delete feed_;
+	delete net_;
+	delete root_;
 }
 
 voltu::Version SystemImpl::getVersion() const
diff --git a/SDK/C++/private/system_impl.hpp b/SDK/C++/private/system_impl.hpp
index 474b2ebe6705a9e824116c8993492561eb0dd56e..dfc2fae09a7b8fd2dafaa5161e49ba0964af092c 100644
--- a/SDK/C++/private/system_impl.hpp
+++ b/SDK/C++/private/system_impl.hpp
@@ -14,7 +14,7 @@ class SystemImpl : public voltu::System
 {
 public:
 	SystemImpl();
-	~SystemImpl();
+	~SystemImpl() override;
 
 	voltu::Version getVersion() const override;
 
diff --git a/SDK/C++/public/include/voltu/feed.hpp b/SDK/C++/public/include/voltu/feed.hpp
index be1a0fc0d260935c5dc8bdcf3472ff8385eb4f40..0a19d30174be9c09ad5461d2c071073741ed33f9 100644
--- a/SDK/C++/public/include/voltu/feed.hpp
+++ b/SDK/C++/public/include/voltu/feed.hpp
@@ -35,6 +35,8 @@ enum class FeedProperty
 class Feed
 {
 public:
+	virtual ~Feed() = default;
+	
 	PY_API virtual std::string getURI() = 0;
 
 	PY_API virtual void remove() = 0;
diff --git a/SDK/C++/public/include/voltu/observer.hpp b/SDK/C++/public/include/voltu/observer.hpp
index 352fe8aaa08208f87a177460cabf0cd0e6cacd27..f42ffaf9a8173b737831a978704ac5810a61620a 100644
--- a/SDK/C++/public/include/voltu/observer.hpp
+++ b/SDK/C++/public/include/voltu/observer.hpp
@@ -25,6 +25,8 @@ enum class ObserverProperty
 class Observer
 {
 public:
+	virtual ~Observer() = default;
+	
 	PY_API virtual void setResolution(uint32_t w, uint32_t h) = 0;
 
 	PY_API virtual void setFocalLength(uint32_t f) = 0;
diff --git a/SDK/C++/public/include/voltu/operator.hpp b/SDK/C++/public/include/voltu/operator.hpp
index 9ffc64c993c9b093d43c4939ff641a47b7bb5f71..a7f4ce9961567912cdb9b73d95731d0e1867d6a5 100644
--- a/SDK/C++/public/include/voltu/operator.hpp
+++ b/SDK/C++/public/include/voltu/operator.hpp
@@ -20,6 +20,8 @@ enum class OperatorId
 class Operator
 {
 public:
+	virtual ~Operator() = default;
+	
 	PY_API virtual voltu::PropertyPtr property(const std::string &name) = 0;
 };
 
diff --git a/SDK/C++/public/include/voltu/pipeline.hpp b/SDK/C++/public/include/voltu/pipeline.hpp
index 994b4af91953250e183301356a6c8e3a2e4be56e..c9894f06366b3a7577ddb01ba322e4784d218aa7 100644
--- a/SDK/C++/public/include/voltu/pipeline.hpp
+++ b/SDK/C++/public/include/voltu/pipeline.hpp
@@ -11,6 +11,8 @@ namespace voltu
 class Pipeline
 {
 public:
+	virtual ~Pipeline() = default;
+	
 	PY_API virtual void submit(const voltu::FramePtr &frame) = 0;
 
 	PY_API virtual bool waitCompletion(int timeout) = 0;
diff --git a/SDK/C++/public/include/voltu/room.hpp b/SDK/C++/public/include/voltu/room.hpp
index da09776227d4e25aeef9f763a0f26270941e090b..4971439b869b514fb9aaca54c826fb4ec2ef8c41 100644
--- a/SDK/C++/public/include/voltu/room.hpp
+++ b/SDK/C++/public/include/voltu/room.hpp
@@ -19,6 +19,8 @@ typedef unsigned int RoomId;
 class Room
 {
 public:
+	virtual ~Room() = default;
+	
 	PY_API virtual bool waitNextFrame(int64_t) = 0;
 
 	PY_API inline bool hasNextFrame() { return waitNextFrame(0); };
diff --git a/SDK/C++/public/include/voltu/system.hpp b/SDK/C++/public/include/voltu/system.hpp
index 6a543698308253e9d4fd056eaf3fb5786b27aa85..0f35bc88caa89f9e9e6fd09807421b147487780b 100644
--- a/SDK/C++/public/include/voltu/system.hpp
+++ b/SDK/C++/public/include/voltu/system.hpp
@@ -24,6 +24,8 @@ struct Version
 class System
 {
 public:
+	virtual ~System() = default;
+	
 	/** Get the semantic version information. */
 	virtual voltu::Version getVersion() const = 0;
 
diff --git a/SDK/C++/public/include/voltu/types/frame.hpp b/SDK/C++/public/include/voltu/types/frame.hpp
index c9a02abaadaae4ef67c69cbcad50f97ed6dc221d..eebc557eae0c2f12c5b8fcaad66e72914c0d2968 100644
--- a/SDK/C++/public/include/voltu/types/frame.hpp
+++ b/SDK/C++/public/include/voltu/types/frame.hpp
@@ -14,6 +14,8 @@ namespace voltu
 class Frame
 {
 public:
+	virtual ~Frame() = default;
+	
 	PY_API PY_RV_LIFETIME_PARENT virtual std::list<voltu::ImagePtr> getImageSet(voltu::Channel channel) = 0;
 
 	PY_API PY_RV_LIFETIME_PARENT virtual voltu::PointCloudPtr getPointCloud(voltu::PointCloudFormat cloudfmt, voltu::PointFormat pointfmt) = 0;
diff --git a/SDK/C++/public/include/voltu/types/image.hpp b/SDK/C++/public/include/voltu/types/image.hpp
index 76d5ec5f099223e36d49cdc6dce4f9435d64d8aa..6064f894d059dbc77ce87d4ac64fcaf93ed842f4 100644
--- a/SDK/C++/public/include/voltu/types/image.hpp
+++ b/SDK/C++/public/include/voltu/types/image.hpp
@@ -30,6 +30,8 @@ PY_NO_SHARED_PTR struct ImageData
 class Image
 {
 public:
+	virtual ~Image() = default;
+	
 	PY_API PY_RV_LIFETIME_PARENT virtual ImageData getHost() = 0;
 
 	virtual ImageData getDevice() = 0;
diff --git a/SDK/C++/public/include/voltu/types/property.hpp b/SDK/C++/public/include/voltu/types/property.hpp
index 2fa3c43b44ab95503b1cca587ef4aab8cd1cf66b..979cb793b674c555fba1924c34765a71896f808b 100644
--- a/SDK/C++/public/include/voltu/types/property.hpp
+++ b/SDK/C++/public/include/voltu/types/property.hpp
@@ -9,6 +9,8 @@ namespace voltu
 class Property
 {
 public:
+	virtual ~Property() = default;
+	
 	PY_API virtual void setInt(int) = 0;
 
 	PY_API virtual void setFloat(float) = 0;