This challenge distills Lessons 4.3 (move semantics), 4.2 (RAII), and 7.1 (std::unique_ptr) into one small type you implement yourself. Production code should use std::unique_ptr, it supports arrays, custom deleters, conversions, and years of edge-case fixes. Here you learn the core invariant: exactly one owner releases the heap object.
If two owners both call delete on the same address, you get double free (heap corruption). If nobody calls delete, you leak. Exclusive ownership makes the rule mechanical: one wrapper, one delete in one destructor.
Copying is deleted because a copy would duplicate responsibility. Move transfers the raw pointer from source to destination and sets the source to nullptr. After auto b = std::move(a);, a must not delete the object, only b may.
Mark move operations noexcept when they cannot throw. Standard containers rely on that guarantee when they reallocate and move elements, Lesson 8.4 discussed vector reallocation and move optimizations.
Move assignment must handle self-move safely (if (this != &other)), destroy any resource already owned, steal the pointer, and null the source. Forgetting to delete the existing resource before stealing causes leaks; forgetting to null the source causes double delete.