SKILL.md
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 (sharedptr). - Child -> Parent (weakptr). - If Child holds shared_ptr to Parent, they never die.
- Do I need a custom deleter?
- Managing C-APIs (FILE, SDLSurface)? - uniqueptr<FILE, DeclType(&fclose)> handles this perfectly.
Trace Up / Down
- Trace Up:
- Issue: "Application memory usage grows endlessly but no 'leaks' reported by Valgrind." - Cause: sharedptr cycle. The reachable memory is technically "owned", just mutually. - Fix: Break the cycle with weakptr.
- 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. |
enablesharedfrom_this |
Zero | Need sharedfromthis() inside member function. |