πŸ”Ήstd::unique_ptr β€” Exclusive Ownership Smart Pointer

🧠 Concept

A std::unique_ptr owns a dynamically allocated object exclusively. No other smart pointer can own the same resource. When the unique_ptr goes out of scope, the object is automatically deleted β€” making it safe and exception-proof.

It cannot be copied, only moved.


βœ… Basic Syntax

#include <iostream>
#include <memory>

class Resource {
public:
    Resource() { std::cout << "Resource acquired.\\n"; }
    ~Resource() { std::cout << "Resource released.\\n"; }
    void greet() const { std::cout << "Hello from Resource\\n"; }
};

int main() {
    std::unique_ptr<Resource> uptr = std::make_unique<Resource>();  // preferred way
    uptr->greet();

    // std::unique_ptr<Resource> uptr2 = uptr;  ❌ Error: cannot copy
    std::unique_ptr<Resource> uptr2 = std::move(uptr);  // βœ… Move allowed

    if (!uptr) std::cout << "uptr is now null\\n";

    return 0;
}

🧷 Key Characteristics

Feature Value
Ownership Exclusive
Copyable ❌ No
Movable βœ… Yes
Overhead Very low (just a pointer)
Thread-safe ❌ No (ownership is not shared)
Default deleter delete (can be customized)
Use case Enforcing unique ownership semantics

πŸ” Custom Deleter Example

auto fileDeleter = [](FILE* f) {
    if (f) {
        std::cout << "Closing file...\\n";
        fclose(f);
    }
};

std::unique_ptr<FILE, decltype(fileDeleter)> fptr(fopen("test.txt", "w"), fileDeleter);

πŸ› οΈ Useful Member Functions

Function Description
.get() Returns the raw pointer
.release() Releases ownership and returns raw pointer
.reset() Deletes current object and takes a new one
.swap() Swaps two unique_ptrs

🧠 Real Use Cases