• 关于指针和句柄的一些小记


    前不久,面试被问到关于迷途指针和空指针的关系;见下:

    int main(){

    char *p="abcde";

    std::cout<<*p<<std::endl;

    delete p;//在这个时候,系统会释放掉p指向的内存,但是p指向的这块地址还存在,当他被其他程序段使用后,我们再次不小心的使用p后,这块地址的数据

    就有可能被覆盖改变,发生意想不到的后果。

    char *q="xxxxxx";

    std::cout<<*q<<std::endl;

    *p="aaa";

    std::cout<<*q<<std::endl;//这时*q指向的内存会被*p覆盖,不再是xxxxxx,有可能是aaaxxx;

    retutn 0;

    }

    上面的p就是一个迷途指针,这种错误在C++中往往是致命的,通常的避免方法是在delete p以后加上一句,p=NULL或者p=0;即将p空指针化,这样做其实并不能完全保证没有错误,但是至少可以在有问题时,顺利排查出错误。

    关于指针和句柄,最简单的区别就是各自的定义,指针往往是指向对象的物理首地址,而句柄这时windows系统中指向对象指针的指针。

    在windows系统中,系统对程序请求的内存工作机制叫虚拟内存管理,简单讲就是动态的管理固定的内存,使内存的大小可以随着程序的需要变化,当不够时就会有系统虚拟化出一部分来满足需求。OK,入题。在程序中对象的内存管理上,win系统中的不同对象的内存地址不是一成不变的,而是实时变化的。所以通过指针来访问对象是不可行,这就需要句柄来完成这个工作,在win中维护着一个固定的对象地址索引表,每个对象都有一个固定的句柄,而这张表由系统维护,使句柄对应着当前对象地址的指针,当程序要操作对象时,即可通过句柄来实时的实现对象的准确映射。

  • 相关阅读:
    8、【C++基础】内存管理
    7、【C++基础】内联函数、友元函数
    5、【C++基础】强制类型转换
    4、【C++基础】引用和指针
    3、【C++基础】基本的输入输出
    2、【C++基础】命名空间
    1、【C++基础】bool数据类型
    13、【C语言基础】预处理器、头文件
    6、git常用命令总结
    5、git标签管理
  • 原文地址:https://www.cnblogs.com/erickingxu/p/2913225.html
Copyright © 2020-2023  润新知