前不久,面试被问到关于迷途指针和空指针的关系;见下:
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中维护着一个固定的对象地址索引表,每个对象都有一个固定的句柄,而这张表由系统维护,使句柄对应着当前对象地址的指针,当程序要操作对象时,即可通过句柄来实时的实现对象的准确映射。