面试题:如何避免野指针?

简介: 面试题:如何避免野指针?

面试题:如何避免野指针

在 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++ 代码时需要细心认真,采取如上所述的措施:

  1. 定义指针变量时,必须初始化为 NULL 或 nullptr。
  2. 动态分配内存后,必须及时手动释放内存。
  3. 避免使用指针乘法和指针偏移,容易越界成为野指针。
  4. 使用智能指针自动管理内存资源。
相关文章
|
4天前
|
C++
C/C++工程师面试题(指针篇)
C/C++工程师面试题(指针篇)
54 0
|
4天前
|
算法 程序员 索引
【Leetcode 程序员面试金典 02.08】 —— 环路检测 |双指针
我们可以使用双指针解决本题,由数学推导可知:a 的距离为(环长度的倍数 - b),即 tmp 指针从头节点走到环开头节点等于 slow 指针走到环开头节点的距离
|
4天前
C面试总结-指针与引用
C面试总结-指针与引用
23 0
|
6月前
|
算法 Go
单链表(面试算法题2)---单链表进阶1之快慢指针
单链表(面试算法题2)---单链表进阶1之快慢指针
28 0
|
6月前
|
编译器 C++
【C++】几道关于this指针的面试题
【C++】几道关于this指针的面试题
39 0
|
4天前
|
编解码 缓存 安全
【C/C++ 泡沫精选面试题03】谈谈C/C++ 智能指针?
【C/C++ 泡沫精选面试题03】谈谈C/C++ 智能指针?
36 1
|
4天前
|
存储 C语言
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
|
4天前
|
安全 IDE Java
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
49 1
|
4天前
|
C++
面试题:常量指针和指针常量?
面试题:常量指针和指针常量?
22 0
|
4天前
|
存储 C++
面试题:C/C++引用和指针的区别?
面试题:C/C++引用和指针的区别?
35 0