所谓野指针,说白了,就是指向无效内存地址的指针,程序通过这种类型的指针访问内存单元时,往往会产生访问违例错误。
那么,有什么可能会产生野指针:
大概可能是:
1.指针变量未初始化以指向合法的对象地址空间。
2.指针指向的内存单元被释放,其后程序却继续使用该地址访问内存。
对于以上提到的第一种情况引起的软件异常,一般比较容易定位,未初始化的指针值可能为NULL,或0xcccccccc。
但是对于第二种情况,又如何呢?
对于绝大部分情况来说,也是比较容易定位的,因为从CRT堆分配出来的堆块,其堆结构ntdll!_HEAP_ENTRY 有个字段flage, 标识该堆块是否正在被释放,
一般情况下,由于第二种情况引起的软件崩溃,观察该字段即可。
注意, 这里是指一般情况,有没有考虑过这种情况,被释放的内存又被重新分配给其它对象了呢?这时候对原先那个保留内存单元的地址的野指针进行操作时会发生什么情况,
这个很难说,假如刚好能进行内存访问,可能没有问题,软件不会崩溃,但倘若不能进行内存访问,软件就会崩溃,判断这种类型的错误,估计就得观察内存上的值,分析出点蛛丝马迹,
证明现在访问的内存值并不是应该存入该内存单元的值,此时我们可能还可以关注别外一个细节,即对象倘若被new出来的,那么指向对象的指针则一定是指向堆块结构中用户区的开始处,
倘若我们发现原先保留对象指针的值,并没有指向堆块结构中用户区的开始处,或许以上提到的被释放的内存又被重新分配的情况该好好的考虑一下了。
在我参与的VC项目中,正巧碰到的被释放的内存又被重新分配导致野指针访问出错的情况,当时没有正确地判断出这种可能,而只是粗略地认为在访问一个已经被释放的对象而己,使BUG的排查时间又推迟了好
几个小时,愧疚。。。。