diff --git a/DirectX/player/commandPlayer.h b/DirectX/player/commandPlayer.h
index 56ce99c..1d1ac83 100644
--- a/DirectX/player/commandPlayer.h
+++ b/DirectX/player/commandPlayer.h
@@ -50,7 +50,7 @@ class CommandPlayer : public CFunction {
   void Read(CBinIStream& stream) override {
     unsigned size = 0;
     stream.read(reinterpret_cast<char*>(&size), sizeof(unsigned));
-    data_.resize(size);
+    data_ = HeapArray<char>(size);
     stream.read(data_.data(), size);
 
     decodeCommand();
@@ -64,7 +64,7 @@ class CommandPlayer : public CFunction {
   virtual void decodeCommand() {}
 
 protected:
-  std::vector<char> data_;
+  HeapArray<char> data_;
 
 private:
   FakeArgument argument_;
diff --git a/common/legacy/include/tools.h b/common/legacy/include/tools.h
index ec7ffe0..cc31b18 100644
--- a/common/legacy/include/tools.h
+++ b/common/legacy/include/tools.h
@@ -641,4 +641,55 @@ class SharedLibrary {
   }
 };
 
+template <typename T = std::byte>
+class HeapArray {
+public:
+  HeapArray() {}
+  HeapArray(const std::size_t size) : size_(size) {
+    data_ = new T[size];
+  }
+
+  ~HeapArray() {
+    delete[] data_;
+  }
+
+  std::size_t size() const {
+    return size_;
+  }
+
+  const T* data() const {
+    return data_;
+  }
+
+  T* data() {
+    return data_;
+  }
+
+  HeapArray& operator=(const HeapArray& other) = delete;
+  HeapArray(const HeapArray& other) = delete;
+
+  HeapArray& operator=(HeapArray&& other) noexcept {
+    delete[] data_;
+    data_ = other.data_;
+    size_ = other.size_;
+
+    other.data_ = nullptr;
+    other.size_ = 0;
+
+    return *this;
+  }
+
+  HeapArray(HeapArray&& other) {
+    data_ = other.data_;
+    size_ = other.size_;
+
+    other.data_ = nullptr;
+    other.size_ = 0;
+  }
+
+private:
+  T* data_ = nullptr;
+  std::size_t size_ = 0;
+};
+
 } // namespace gits