面试题:如何避免野指针?
在 C++ 中,野指针指的是指向已经释放的内存地址或没有初始化的随机地址的指针,一旦使用野指针会导致不可预测的行为,例如程序崩溃、数据损坏等问题。为了避免野指针的发生,可以采取以下几种方法。
1.初始化指针
使用指针变量前一定要先初始化它,以防止指针变量中保存着无效的地址或者随机值。即使是声明一个空指针,也应该明确地初始化它为 NULL 或 nullptr。
int *p = nullptr; // 初始化为空指针
2.及时释放指针
动态分配内存后必须及时手动释放内存,避免出现指针悬挂的情况。同时,需要避免重复释放同一个指针所指向的内存空间。
int *p = new int[10]; // ... delete[] p; // 及时释放指针
3.避免指针乘法和指针偏移
指针乘法和指针偏移可能会导致指针越界,指向未知的内存区域,容易成为野指针。
int *p = new int[10]; int x = *(p + 11); // 超过数组边界,可能导致野指针
4.使用智能指针
智能指针是一种现代 C++ 中的高级类型,它可以自动管理内存资源,并且避免了手动释放指针和解决悬挂指针的问题。智能指针主要有两种类型:unique_ptr 和 shared_ptr。
std::unique_ptr<int> p = std::make_unique<int>(10); std::shared_ptr<int> p2 = std::make_shared<int>(20); // ... // 不需要手动释放指针
总结
为了避免野指针的发生,编写 C++ 代码时需要细心认真,采取如上所述的措施:
- 定义指针变量时,必须初始化为 NULL 或 nullptr。
- 动态分配内存后,必须及时手动释放内存。
- 避免使用指针乘法和指针偏移,容易越界成为野指针。
- 使用智能指针自动管理内存资源。