C++指针常见错误规避方法(精简干货)

一、野指针(最高频错误)

错误场景

  1. 指针未初始化,随机指向未知内存
  2. 内存delete后不置空,继续访问
  3. 函数返回局部栈变量地址

规避方案

  1. 定义指针直接初始化为空:int* p = nullptr;
  2. 释放内存后置空:delete p; p = nullptr;
  3. 绝不返回局部变量地址;需返回数据改用new堆内存/引用

二、空指针访问

错误场景

未判断指针是否为空,直接解引用*p导致程序崩溃

规避方案

使用前做空判断:

if (p != nullptr)
    cout << *p;

三、内存泄漏(new不delete)

错误场景

堆内存开辟后无释放,程序长期运行占用内存

规避方案

  1. 裸指针:new与delete严格配对,数组用delete[]
  2. 现代C++优先用智能指针,自动释放无需手动管理
    • unique_ptr、shared_ptr,推荐make_unique创建

四、重复释放/二次delete

错误场景

同一块堆内存多次执行delete

规避方案

释放后立刻赋值nullptr;delete空指针不会报错,不会崩溃

五、数组指针释放漏写[]

错误

int* arr = new int[10];
delete arr; // 错误,数组必须delete[]

正确

delete[] arr;
arr = nullptr;

六、指针越界访问

错误场景

数组指针偏移超出数组长度,篡改其他内存

规避

记录数组长度,循环访问限制边界;优先用vector替代裸数组

七、const指针误用

错误

用指向常量的指针修改数据

区分记忆

  1. const int* p:值不可改,指针可换指向
  2. int* const p:指针地址固定,值可修改

八、不同类型指针强制转换

错误

int强转char随意读写,内存解析错乱

规避

无必要不强制转换;类型转换使用static_cast规范转换

九、多级指针管理混乱

规避

二级/多级指针分配、释放成对操作;能不用二级指针就用容器替代

十、通用最优实践(总结)

  1. 少用裸指针,优先std::vector、智能指针
  2. 指针初始化、用完置空、使用前判空
  3. 堆内存遵循:谁分配,谁释放
  4. 不操作栈临时对象地址
  5. 数组统一用容器代替裸指针数组

更多推荐