zoukankan      html  css  js  c++  java
  • 指针

    一、空指针常量

    一个表示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,则删除基础对象)。

     

  • 相关阅读:
    hdu 2553 N皇后问题(dfs)
    hdu 1043 Eight(双向bfs)
    牛人的ACM经验 (转)
    康托和逆康托展开(转)
    hiho Mission Impossible 6(模拟 未提交验证。。)
    数组越界也可以这么巧~~~
    poj 1679 The Unique MST(次小生成树)
    zoj 3204 Connect them(最小生成树)
    hdu 4463 Outlets(最小生成树)
    廖雪峰Java1-2程序基础-8字符和字符串
  • 原文地址:https://www.cnblogs.com/healthylife/p/5866287.html
Copyright © 2011-2022 走看看