空悬指针和野指针

前言

以前经常把这两个概念混为一谈,虽然这它们的概念类似,有一定的相似性,但是各自的成因和解决防范方法都是不同的,特记录在此。

空悬指针

定义

一个原生指针分配内存后,它并没有探测内存是否已经被释放或者被损坏的能力。当所管理的内存被释放后,若这个指针没有被销毁或置为NULL,它就成了一个空悬指针。

危害

可能会出现随机的错误,甚至导致程序崩溃,而且这种问题一般很难定位,特别是在大型工程里。

解决方法

使用weak_ptr和shared_ptr配套可以解决“不知道对象是否还活着”的问题。

野指针

定义

没有初始化过的指针,可能被编译器随机赋值

危害

基本同上

解决方法

尽量避免使用原生指针,使用智能指针代替它,如果必须使用,在一定要初始化它。

原文地址:https://www.cnblogs.com/jo3yzhu/p/12283744.html

时间: 2024-10-12 19:29:56

空悬指针和野指针的相关文章

空悬指针和野指针(Dangling pointer and wild pointer)

空悬指针 简单地说,空悬指针是对象的指针的生存周期比对象更长所导致的,也就是说,对象销毁.删除了,不存在了,指针仍然存在,这时这个指针就成了空悬指针. 当对象被析构.删除时,如果指向它的指针没有被同时修改,那么指针仍然会指向那块内存(但是那块内存已经没有东西了).系统此时可能会重新分配这块已经free掉的内存,如果程序再通过这个指针读这块内存,就可能会有不可预见的事情发生,因为这块内存可能被分配了完全不同的内容.如果程序此时要写这块内存,就可能会造成数据污染,进而可能带来超级难被发现的bug.如

C++教程:NULL 指针、零指针、野指针

C++教程:NULL 指针.零指针.野指针 1. 空指针.NULL指针.零指针 1.1什么是空指针常量 0.0L.".3 – 3.0 * 17 (它们都是"integer constant expression")以及 (void*)0 (我觉得(void*)0应该算是一个空指针吧,更恰当一点)等都是空指针常量(注意 (char*) 0 不叫空指针常量,只是一个空指针值).至于系统选取哪种形式作为空指针常量使用,则是实现相关的.一般的 C 系统选择 (void*)0 或者 0

指针辨析:悬垂指针、哑指针、野指针、智能指针

悬垂指针: 1:提出的原因: 请看下面的代码片段: [cpp] view plaincopyprint? int *p=NULL; void main() { int i=10;p=&i; cout<<"第一次:*p = "<<*p<<endl; cout<<"第二次:*p = "<<*p<<endl; } [cpp] view plaincopyprint? int *p=NULL;

【Objective-C】09-空指针和野指针

一.什么是空指针和野指针 1.空指针 1> 没有存储不论什么内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针.在没有被详细初始化之前.其值为0. 以下两个都是空指针: 1 Student *s1 = NULL; 2 3 Student *s2 = nil; 2.野指针 "野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针.野指针是很危急的. 回到顶部 二.野指针和空指针样例 接下来用一个简单的样例对照一下野指针和

李洪强iOS开发之【Objective-C】09-空指针和野指针

一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针: 1 Student *s1 = NULL; 2 3 Student *s2 = nil; 2.野指针 "野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针.野指针是非常危险的. 二.野指针和空指针例子 接下来用一个简单的例子对比一下野指针和空指针的区别

学习笔记之09-空指针和野指针

一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针: 1 Student *s1 = NULL; 2 3 Student *s2 = nil; 2.野指针 "野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针.野指针是非常危险的. 二.野指针和空指针例子 接下来用一个简单的例子对比一下野指针和空指针的区别

NULL指针、零指针、野指针

1. 空指针.NULL指针.零指针 1.1什么是空指针常量 0.0L.'\0'.3 - 3.0 * 17 (它们都是"integer constant expression")以及 (void*)0 (我觉得(void*)0应该算是一个空指针吧,更恰当一点)等都是空指针常量(注意 (char*) 0 不叫空指针常量,只是一个空指针值).至于系统选取哪种形式作为空指针常量使用,则是实现相关的.一般的 C 系统选择 (void*)0 或者 0 的居多(也有个别的选择 0L):至于 C++

c++中的悬浮指针和野指针 二级指针

(1) c++中的悬浮指针:声明了但没有被付值的指针,它指向内存中的任意一个空间.避免悬浮指针的一个方法是开始就付值为NULL (2)"野指针"不是NULL指针,是指向"垃圾"内存的指针.人们一般不会错用NULL指针,因为用if语句很容易判断.但是"野指针"是很危险的,if语句对它不起作用.野指针的成因主要有两种: 一.指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气.所以,指针变量在创建的同

空指针、迷途指针、野指针

1.野指针: 声明一个指针(例如 int *p;),编译器会随机分配一个内存地址给它,但是,此地址不可用(如 cout<<p; 此句会出现运行时错误,见图1,但是编译会通过).当然,在声明时初始化才是好习惯(如 int *p = NULL;),这也是避免野指针的方法. 2.迷途指针: int *p = new int; delete p; 此时的p指针就是一个迷途指针.执行new操作时,编译器开辟一段内存给p指针专用,当delete后,此段内存由编译器收回,并且此段内存可以分配给其它对象使用.