Claude-skill-registry cpp-pointer-safety-management

Comprehensive guidelines for safe pointer management in C/C++ code. Use when working with pointer variables, dynamic memory allocation, or any code involving pointer operations to prevent memory leaks, memory corruption, and dangling pointers.

install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/cpp-pointer-safety-management" ~/.claude/skills/majiayu000-claude-skill-registry-cpp-pointer-safety-management && rm -rf "$T"
manifest: skills/data/cpp-pointer-safety-management/SKILL.md
source content

C/C++ Pointer Safety Management

When to Use This Skill

Apply these guidelines when:

  • Declaring or initializing pointer variables
  • Allocating dynamic memory on the heap
  • Passing pointers between functions
  • Accessing memory through pointers
  • Releasing or deallocating memory
  • Refactoring legacy pointer-based code

Declaration and Initialization

Explicit Type Specification

  • Always declare pointers with explicit types
  • Use the "asterisk (*) rule" for clarity: place the asterisk next to the pointer name, not the type

Immediate Initialization

  • Initialize pointers immediately upon declaration
  • Either assign valid memory address or set to NULL/nullptr
  • Never leave pointers uninitialized
// Good
int* pointer = nullptr;
int* pointer = new int(42);

// Bad
int* pointer;  // Uninitialized - dangerous!

Memory Allocation and Usage

Pre-Use Validation

  • Always check pointer validity before dereferencing
  • Perform boundary checks for array pointers
  • Understand the data type the pointer references

Clarity and Safety Techniques

  • Use additional variables to improve code clarity
  • Implement "dog tag fields" or explicit redundancy for validation
  • Apply "memory parachute" techniques for critical operations
// Validation before use
if (pointer != nullptr) {
    *pointer = value;
}

// Boundary checking
for (int i = 0; i < array_size && i < max_safe_size; i++) {
    array_ptr[i] = value;
}

Memory Release and Cleanup

Proper Deallocation

  • Always free dynamically allocated memory
  • Set pointers to NULL/nullptr after deletion to prevent dangling pointers
  • Exercise caution when deleting nodes in linked structures
delete pointer;
pointer = nullptr;  // Prevent dangling pointer

Linked List Node Deletion

  • Maintain list integrity during node removal
  • Update adjacent node pointers before freeing memory
  • Consider edge cases (head, tail, single node)

Safe Alternatives

Modern C++ Approaches

  • Use smart pointers (
    std::unique_ptr
    ,
    std::shared_ptr
    )
  • Prefer C++ references over pointers when possible
  • Leverage RAII (Resource Acquisition Is Initialization) patterns

Encapsulation Techniques

  • Use wrapper functions (e.g., SAFE_ routines) to isolate pointer operations
  • Avoid pointer type casting when possible
  • Implement custom memory managers for complex scenarios
// Smart pointer example
std::unique_ptr<int> smart_ptr = std::make_unique<int>(42);
// Automatic cleanup when out of scope

Common Pitfalls to Avoid

  • Never dereference NULL or uninitialized pointers
  • Avoid memory leaks by matching every allocation with deallocation
  • Prevent double-free errors
  • Eliminate dangling pointers
  • Avoid buffer overruns in pointer arithmetic
  • Minimize use of raw pointers in modern C++ code