数组越界访问导致未定义行为,应使用std::vector或边界检查;2. 未初始化或悬空指针引发崩溃,需初始化为nullptr并用智能指针管理;3. 数组传参退化为指针,应显式传递大小或使用std::array。

在C++编程中,数组和指针是基础但容易出错的部分。很多初学者甚至有经验的开发者都会在使用过程中犯一些典型错误。这些错误可能导致程序崩溃、内存泄漏或不可预测的行为。下面分析几种最常见的错误及其避免方法。
1. 数组越界访问
数组越界是最常见的运行时错误之一。C++不会自动检查数组边界,一旦访问超出分配范围的元素,就会引发未定义行为。
错误示例:
int arr[5] = {1, 2, 3, 4, 5};arr[5] = 6; // 错误:索引5超出范围(合法索引为0~4)
建议:
立即学习“C++免费学习笔记(深入)”;
- 始终确保循环条件不超过数组大小减一
- 使用
std::size
或sizeof(arr)/sizeof(arr[0])
获取数组长度 - 优先考虑使用
std::vector
或std::array
,它们提供at()
方法进行边界检查
2. 指针未初始化或悬空
使用未初始化或已释放的指针会导致严重问题,比如读取垃圾值或段错误。
常见错误:
int* ptr;*ptr = 10; // 错误:ptr未初始化,指向随机地址
另一个例子:
int* ptr = new int(5);delete ptr;
*ptr = 10; // 错误:ptr已成为悬空指针
建议:
立即学习“C++免费学习笔记(深入)”;
- 声明指针时立即初始化为
nullptr
- 释放内存后将指针设为
nullptr
- 使用智能指针如
std::unique_ptr
或std::shared_ptr
自动管理生命周期
3. 数组与指针混淆传递
很多人误以为函数参数中的数组会完整传递,实际上它会退化为指针。
错误理解:
void func(int arr[10]) {cout }
结果:无法在函数内正确获取数组长度。
解决方法:
- 额外传入数组长度作为参数
- 使用引用传递固定大小数组:
void func(int (&arr)[10])
- 改用
std::array
或std::vector
,自带尺寸信息
4. 动态数组内存管理错误
使用
new[]和
delete[]时配对不当会造成内存泄漏或运行时错误。
典型错误:
int* arr = new int[10];delete arr; // 错误:应使用delete[]
// 或者:
int* p = new int(5);
delete[] p; // 错误:new和delete[]不匹配
正确做法:
new[]
必须配对delete[]
new
配对delete
- 尽量避免手动管理,使用容器或智能指针替代
基本上就这些常见问题。掌握这些细节能显著提升代码稳定性和安全性。










