diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
index 202af8f01b..174f03eab5 100644
--- a/common/CMakeLists.txt
+++ b/common/CMakeLists.txt
@@ -76,6 +76,7 @@ target_sources(common PRIVATE
RwMutex.h
SafeArray.h
ScopedAlloc.h
+ ScopedGuard.h
ScopedPtrMT.h
SettingsInterface.h
SettingsWrapper.h
diff --git a/common/ScopedGuard.h b/common/ScopedGuard.h
new file mode 100644
index 0000000000..1ad9abd216
--- /dev/null
+++ b/common/ScopedGuard.h
@@ -0,0 +1,58 @@
+/* PCSX2 - PS2 Emulator for PCs
+ * Copyright (C) 2002-2021 PCSX2 Dev Team
+ *
+ * PCSX2 is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU Lesser General Public License as published by the Free Software Found-
+ * ation, either version 3 of the License, or (at your option) any later version.
+ *
+ * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with PCSX2.
+ * If not, see .
+ */
+
+#pragma once
+#include "Pcsx2Defs.h"
+#include
+#include
+
+/// ScopedGuard provides an object which runs a function (usually a lambda) when
+/// it goes out of scope. This can be useful for releasing resources or handles
+/// which do not normally have C++ types to automatically release.
+template
+class ScopedGuard final
+{
+public:
+ __fi ScopedGuard(T&& func)
+ : m_func(std::forward(func))
+ {
+ }
+ __fi ScopedGuard(ScopedGuard&& other)
+ : m_func(std::move(other.m_func))
+ {
+ other.m_func = nullptr;
+ }
+
+ __fi ~ScopedGuard()
+ {
+ if (!m_func.has_value())
+ return;
+
+ m_func.value()();
+ m_func.reset();
+ }
+
+ ScopedGuard(const ScopedGuard&) = delete;
+ void operator=(const ScopedGuard&) = delete;
+
+ /// Prevents the function from being invoked when we go out of scope.
+ __fi void Cancel()
+ {
+ m_func.reset();
+ }
+
+private:
+ std::optional m_func;
+};
diff --git a/common/common.vcxproj b/common/common.vcxproj
index a9eb69c152..1279726b75 100644
--- a/common/common.vcxproj
+++ b/common/common.vcxproj
@@ -98,6 +98,7 @@
+
@@ -160,4 +161,4 @@
-
+
\ No newline at end of file
diff --git a/common/common.vcxproj.filters b/common/common.vcxproj.filters
index 81fc51b00a..c35d5215d9 100644
--- a/common/common.vcxproj.filters
+++ b/common/common.vcxproj.filters
@@ -270,6 +270,9 @@
Header Files
+
+ Header Files
+
@@ -289,4 +292,4 @@
Source Files
-
+
\ No newline at end of file