• 每日一问9:关于野指针


    C++每日一问9:关于野指针

    1.什么是野指针

    ​ 野指针(wild pointer),也就是指向了一个未知位置的指针,解引用一个野指针就是访问一个不确定的地址,获取一个不确定的结果。

    2.野指针的成因

    ​ 野指针的成因一般有三种:

    1.指针变量声明时未初始化

    int main()
    {
    	int* a ;  					//定义指针时,未初始化,指针指向随机地址
    	cout << "a:"<<a<<ends<<"*a:"<<*a<<endl;		//使用为初始化的指针,error
    	return 0;
    }
    

    2.指针释放后未置空

    int main()
    {
    	int* a = new int(2);						
    	delete a;		//释放指针后没有将指针置为空,随后继续使用该指针,error
    	cout << "a:"<<a<<ends<<"*a:"<<*a<<endl;
    	return 0;
    }
    

    3.指针操作超越变量作用域。不要用指针指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。此时,指针就会指向一个未知的地址。

    int* func(int a)		//返回了一个临时变量的地址,函数当时可能会正确运行。但接下来的任何函数调用都会覆盖num的地址,
    {				//这时再读取num的值就不正确了
        int num = a;
        return &num;
    }
    
    int main()
    {
    	int* a = fun(3);
    	cout << *a << endl;
    	int* b = fun(4);
    	cout << *a << endl;
    	return 0;
    }
    

    2.与悬垂指针(Dangling pointer)的区别

    ​ 悬垂指针也叫迷途指针,其实也可以看作野指针。如果非要做出区别,那么悬垂指针是指,当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址。而野指针是指,未经初始化的指针。这里没有必要太计较。

    3.如何避免野指针

      - 最大的建议就是,有条件时使用封装更加完善的智能指针。
      - 养成良好编程习惯。定义指针时一定要初始化;释放指针所指向的内存空间时,同时也要置指针为NULL;
  • 相关阅读:
    ABP.NET 方法使用 HTTPPOST,HTTPGET,HTTPPUT 特性
    Asp.Net Core 获取配置系统的链接字符串
    ABP.NET CORE 框架 取消新增用户邮箱地址必填验证
    前端开发常用组件库
    微信RSA加密公钥API
    动手实现一个较为简单的MQTT服务端和客户端
    计算入职时间的时间算法
    Windows Terminal 安装及美化
    Windows10内置Linux子系统(WSL)安装
    分享powershell设定网卡,ip,网关,dns的命令
  • 原文地址:https://www.cnblogs.com/honernan/p/14095490.html
Copyright © 2020-2023  润新知