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.
#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;
}
| 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 |
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);
| 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 |