diff --git a/include/buffer.h b/include/buffer.h
index 6f79e98fc5b6c64b1ab39bd548b3d97b32873727..2f401be849b767bc6a6272be438c91c83036d31a 100644
--- a/include/buffer.h
+++ b/include/buffer.h
@@ -15,6 +15,7 @@ public:
     buffer(const size_t required_size, const MemType mem); // Done
     buffer(const buffer& other); // Done
     buffer(buffer&& other) noexcept; // Done
+    void swap(buffer& other) noexcept;
     ~buffer(); // Done
 
     bool is_available() const; // Done
diff --git a/src/buffer.cpp b/src/buffer.cpp
index 572da6196725bd84e40b92d8273da08ce3147b54..8e2a7c31355ad8225db852c95f97132013be895d 100644
--- a/src/buffer.cpp
+++ b/src/buffer.cpp
@@ -55,7 +55,7 @@ buffer::buffer(const buffer& other)
 }
 
 buffer::buffer(buffer&& other) noexcept : 
-    mem(other.mem), ptr(std::move(other.ptr)), allocated_size(other.allocated_size),
+    mem(other.mem), ptr(other.ptr), allocated_size(other.allocated_size),
     scalar_size(other.scalar_size), is_free(other.is_free),
     id(other.id)
 {    
@@ -84,6 +84,23 @@ buffer& buffer::operator=(const buffer& other)
     return *this;
 }
 
+void buffer::swap(buffer& other) noexcept
+{
+    std::swap(ptr, other.ptr);
+    mem = other.mem;
+    allocated_size = other.allocated_size;
+    scalar_size = other.scalar_size;
+    is_free = other.is_free;
+    id = other.id;
+
+    other.ptr = nullptr;
+    other.allocated_size = 0;
+    other.scalar_size = 0;
+    other.is_free = false;
+    other.id = -1;
+    other.mem = MemType::UNDEF;
+}
+
 buffer& buffer::operator=(buffer&& other) noexcept
 {
     if (this != &other)
@@ -91,19 +108,8 @@ buffer& buffer::operator=(buffer&& other) noexcept
         assert(other.mem != MemType::UNDEF);
         deallocate();
 
-        mem = other.mem;
-        ptr = std::move(other.ptr);
-        allocated_size = other.allocated_size;
-        scalar_size = other.scalar_size;
-        is_free = other.is_free;
-        id = other.id;
-
-        other.ptr = nullptr;
-        other.allocated_size = 0;
-        other.scalar_size = 0;
-        other.is_free = false;
-        other.id = -1;
-        other.mem = MemType::UNDEF;
+        buffer temp{std::move(other)};
+        swap(temp);
     }
 
     return *this;