• 【C++学习笔记】野指针的定义与避免


    1.野指针的定义

    指向非法的内存地址指针叫作野指针(Wild Pointer),也叫悬挂指针(Dangling Pointer),意为无法正常使用的指针。

    2.出现野指针的常见情形

    2.1使用未初始化的指针

    出现野指针最典型的情形就是在定义指针变量之后没有对它进行初始化,如下面的程序。

    #include 
    using name space std;
    int main()
    {
        int* p;
        cout<<*p<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.2指针所指的对象已经消亡

    指针指向某个对象之后,当这个对象的生命周期已经结束,对象已经消亡后,仍使用指针访问该对象,将出现运行时错误。考察如下程序。

    #include 
    using name space std;
    
    int* retAddr()
    {
        int num=10;
        return #
    }
    
    int main()
    {
        int* p=NULL;
        p=retAddr();
        cout<<&p<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    以上程序编译和运行都没有错误,输出结果如下:

    001AFD48
    1701495776
    
    • 1
    • 2

    最后一行,输出的并非想象中的num的值10,因为变量num是存储在栈空间的局部变量,离开函数超出其作用域后就会被释放掉,因此输出的值就是不确定的值了。

    2.3指针释放后之后未置空

    指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。对指针进行free和delete,只是把指针所指的内存空间给释放掉,但并没有把指针本身置空,此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生野指针。考察如下程序。

    #include 
    using name space std;
    
    int main()
    {
        int* p=NULL;
        p= new int[10];
        delete p;
        //int *p = NULL;
        cout<<"p[0]:"<

程序输出结果是一个随机值,因为此时的指针所指向的空间是垃圾内存,存放着随机值。

3.如何避免野指针的出现

野指针有时比较隐蔽,编译器不能发现,为了防止野指针带来的危害,开发人员应该注意以下几点。

#define xfree(x) free(x); x = NULL;
  • 1
  • 相关阅读:
    你好,法语!A2知识点总结(4)
    OpenCV项目开发实战--实现使用面部标志在脸上覆盖面具--附完整源码
    我想告诉你这样做就能做一个简单的个人网站出来:::全流程讲解(阿里云)
    Gin-Swagger的使用
    MC Instruction Decoder
    vmware本机安装虚拟机centos7.*
    【组合回溯递归】【树层去重used标记】Leetcode 40. 组合总和 II
    java面试题及答案2020 大汇总
    Thymeleaf学习(2)—— 流程控制
    【655. 输出二叉树】
  • 原文地址:https://blog.csdn.net/qq_25743167/article/details/132781863