diff --git a/src/shared/drivers/dma/DMA.h b/src/shared/drivers/dma/DMA.h
index 3bb976f0f48391b4631fdd6e1ff1f59cfc462a9b..6fd45988bc063a8d03344a04a3c1e17b31d08c67 100644
--- a/src/shared/drivers/dma/DMA.h
+++ b/src/shared/drivers/dma/DMA.h
@@ -416,4 +416,28 @@ public:
     DMAStream& operator=(const DMAStream&) = delete;
 };
 
+class DMAStreamGuard
+{
+public:
+    DMAStreamGuard(DMAStream* ptr) : pStream(ptr) {}
+
+    ~DMAStreamGuard()
+    {
+        if (pStream != nullptr)
+        {
+            DMADriver::instance().releaseStream(pStream->getStreamId());
+        }
+    }
+
+    DMAStreamGuard(const DMAStreamGuard&)            = delete;
+    DMAStreamGuard& operator=(const DMAStreamGuard&) = delete;
+
+    DMAStream* operator->() { return pStream; }
+
+    inline DMAStream* get() { return pStream; }
+
+private:
+    DMAStream* pStream = nullptr;
+};
+
 }  // namespace Boardcore
diff --git a/src/tests/drivers/test-dma-mem-to-mem.cpp b/src/tests/drivers/test-dma-mem-to-mem.cpp
index d4970559df83786494acea4fdc851c308bff158b..fcfe2bfee6fe825200cfc28d9b70cecac934af7f 100644
--- a/src/tests/drivers/test-dma-mem-to-mem.cpp
+++ b/src/tests/drivers/test-dma-mem-to-mem.cpp
@@ -33,10 +33,10 @@ void printBuffer(uint8_t *buffer, size_t size);
 
 int main()
 {
-    DMAStream *stream = DMADriver::instance().automaticAcquireStreamBlocking(
-        DMADefs::Peripherals::PE_MEM_ONLY, std::chrono::seconds::zero());
+    DMAStreamGuard stream(DMADriver::instance().automaticAcquireStreamBlocking(
+        DMADefs::Peripherals::PE_MEM_ONLY, std::chrono::seconds::zero()));
 
-    if (stream == nullptr)
+    if (stream.get() == nullptr)
     {
         printf("Error, cannot allocate dma stream\n");
         return 0;