指针

一、空指针常量

一个表示0值的整数常量,叫做空指针常量。他可以赋值给任何指针类型,以内他是变量类型void*。空指针常量存在意义还在强调它并不指向任何对象。

二、空指针

(void *)0就是一个空指针。空指针不指向任何实际的对象或者函数,反过来说,任何对象或者函数的地址都不可能是空指针。

可以用NULL 初始化一个空指针。在校验一个指针是否为有效指针时,更倾向于利用if(!p=NULL)。

三、NULL指针

 

四、零指针

零值指针是值为0的指针,可以是任何一种类型的指针,可以是void*,也可以是char*、int*等。

空指针和零指针不同。非空指针可能值为0。

五、野指针

野指针不是空指针,是一个指向垃圾内存的指针。

形成原因:

1.指针变量没有初始化

2.指针被free或者delete之后,没有设置为NULL,让人误以为这是一个合法的指针。因为指针指向的内存被清理,指针本身并没有被清理。

3.指针操作超越了变量的作用范围

情况一:指针访问越界,例如超过数组的范围

情况二:指针指向一个临时变量的引用,当该变量释放时(比如生命周期结束),此时的指针就成了野指针。

六、悬垂指针/悬垂指针/迷途指针

指向曾经存在的对象,但该对象已经不存在了,此类指针称为垂悬指针,(包含在野指针中。)因此不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放;或者在free或者delete后,将指针置为NULL。

七、空指针在内存中的存储

空指针的内部实现不等同于整数0的对象表示。不同的系统对空指针在内存中的位置实现方式不同。常见的空指针一般指向0地址,即空指针的内部用全0表示。

程序中的指针其实是windows内存段偏移后的地址,而不是实际物理地址,所以不同的地址中的零值指针指向同一个0地址,其实在内存中都不是物理内存的开端0,而是分段内存的开端。所以程序A中的零值指针和程序B中的零值指针指向的地方可能完全不同。

空指针赋值分区

这一分区是进程的地址空间中从0X00000000到0X0000FFFF的闭区间(64K大小),这64K的内存是一块保留内存,不能被程序动态内存器分配,不能访问也不能使用,保留该分区的目的就是为了帮助程序员捕获对空指针的赋值。如果进程中的线程试图读取或者写入位于这一分区内的内存地址,就会引发访问违规。

八、为什么空指针访问会出现异常

如果一个指针为空指针,那么该指针所指向的逻辑地址空间位于空指针赋值分区的区间上。空指针赋值分区上的逻辑地址没有物理存储器与之对应,因而访问时就会产生违规访问的异常。

九、智能指针

智能指针是存储指向动态分配对象指针的类,用于生存期的控制,能够确保自动销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用技术。智能指针类将一个计数器和类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置1,当对象作为另一个对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用技术减为0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用技术(如果引用计数减为0,则删除基础对象)。

 

原文地址:https://www.cnblogs.com/healthylife/p/5866287.html