今天遇到了一个比较弱的问题,但是涉及到一些东西,所以记录一下。
问题表现为,系统BOSD,在析构函数进行free的时候,有的时候是在使用buffer的过程中就BSOD。
之前是怀疑因为分配的是paged buffer,所以在一些比较高级的IRQ的时候,会出现问题。但是ksproperty一般都是passive level的。然后就试了试unpaged buffer,发现问题依旧存在。
而后就去查,发现是有指针写越界了。这样,在释放这个指针的时候,就会出现把存放指针size的那个buffer给覆盖了,后面就会在释放的时候报错,提示释放了已经释放的空间。
这个问题细想起来是对的,因为重复释放,所以出现了BSOD。不过为什么重复释放会出现BSOD呢?
查了一下,有网友的解释是这样的
=====
free不是清零,而是将这块内存标记为未使用,之所以不清零,是出于性能的考虑。计算机上到处有类似的设计,比如说,你删除一个文件,并不是真的将删除的文件填充0,而也是把对应的簇标记为未分配。格式化硬盘也是如此。这也是为什么删除了文件只要没有写入新的文件你还能将它找回来的原因。
重复释放内存报错的原因是因为这些内存已经标记为未分配,就不再有记录了,所以再次释放标准库就会丢出异常。
=====
尚未验证,不过应该free应该不是想象的那么简单。涉及到内存管理的问题。
另外,如果打开verifier,就可以第一时间,在内存写越界的时候就爆出这个问题,而不是到释放的时候才报错。这也是个好方法。