指针在访问越界时不崩溃,但是释放的时候发生崩溃,底层原因分析
电脑系统:windows11- vs2013
问题描述:
在工作中,遇到一个棘手的bug,申请一个指针P,在给P赋值或者拷贝操作的时候,访问都是正常的,但是最后释放该指针P时,程序crash了。
固定思维,认为如果越界访问了,指针应该会crash才对,所以没有想到代码中有越界访问的问题;in fact, 指针在vc内部存储空间中的管理,并不是我们需要多少就刚好申请多少。
如上图所示,荧光绿色是你想申请的8字节的指针p,不管是debug还是release,指针p都是在除了这8字节之外,会有一个指针开始,指针结束的空间,用于指示指针释放的地址范围,当然,vc内部管理中,供程序员申请和释放的内存空间,使用结尾为1去标识,并以16进制存储,也就是说,他会为你的指针分配16的倍数次,好对齐,这样16的整数倍,它的最后一个数1就是标识符了。在不满足为16倍数时,vc系统内部会进行pad填充,这就意味着,也许你虽然申请了8字节,但是实际分配给你的不止8字节,当你越界访问时,不会崩溃,但是会破坏vc对指针分配时的固定的管理格式,而在释放该指针p时,找不到指针结束地址的位置而导致可能删除了我们没有权限访问的地址空间,从而导致程序crash。在代码开发过程中,使用指针的时候需要小心为上!