C++ Smart Pointers (Resource Management)
Core Question
How many owners does this resource to have?
- •One:
std::unique_ptr(90% of cases). - •Many:
std::shared_ptr. - •Observer:
std::weak_ptr.
Error → Design Question
| Issue | Design Question |
|---|---|
| Memory Leak (Cycles) | Do you have shared_ptr pointing to each other? Cycle = Leak. |
| Dangling Pointer | Did you store a weak_ptr or raw pointer but check it too late? |
| Double Free | Did you make two unique_ptrs from one raw pointer? |
| Performance | Are you copying shared_ptr unnecessarily? (Atomic ops). |
Thinking Prompt
- •
Can I use
unique_ptr?- •Always start here. It has zero overhead (size = raw pointer).
- •It forces you to think about ownership transfer (
std::move).
- •
Is this a Cycle?
- •Parent -> Child (
shared_ptr). - •Child -> Parent (
weak_ptr). - •If Child holds
shared_ptrto Parent, they never die.
- •Parent -> Child (
- •
Do I need a custom deleter?
- •Managing C-APIs (
FILE*,SDL_Surface*)? - •
unique_ptr<FILE, DeclType(&fclose)>handles this perfectly.
- •Managing C-APIs (
Trace Up / Down
- •
Trace Up:
- •Issue: "Application memory usage grows endlessly but no 'leaks' reported by Valgrind."
- •Cause:
shared_ptrcycle. The reachable memory is technically "owned", just mutually. - •Fix: Break the cycle with
weak_ptr.
- •
Trace Down:
- •Intent: "I need a list of heterogeneous objects."
- •Code:
std::vector<std::unique_ptr<Base>>
Quick Reference
| Pattern | Cost | Use When |
|---|---|---|
make_unique | Zero | Creating new heap objects. |
make_shared | 1 Alloc | Creating access-controlled shared objects. |
weak_ptr | Control Block | Breaking cycles, Caching. |
enable_shared_from_this | Zero | Need shared_from_this() inside member function. |