memory corruption

Posted sunny,lee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了memory corruption相关的知识,希望对你有一定的参考价值。

今天遇到了一个比较弱的问题,但是涉及到一些东西,所以记录一下。

问题表现为,系统BOSD,在析构函数进行free的时候,有的时候是在使用buffer的过程中就BSOD。

之前是怀疑因为分配的是paged buffer,所以在一些比较高级的IRQ的时候,会出现问题。但是ksproperty一般都是passive level的。然后就试了试unpaged buffer,发现问题依旧存在。

而后就去查,发现是有指针写越界了。这样,在释放这个指针的时候,就会出现把存放指针size的那个buffer给覆盖了,后面就会在释放的时候报错,提示释放了已经释放的空间。

这个问题细想起来是对的,因为重复释放,所以出现了BSOD。不过为什么重复释放会出现BSOD呢?

查了一下,有网友的解释是这样的

=====

free不是清零,而是将这块内存标记为未使用,之所以不清零,是出于性能的考虑。计算机上到处有类似的设计,比如说,你删除一个文件,并不是真的将删除的文件填充0,而也是把对应的簇标记为未分配。格式化硬盘也是如此。这也是为什么删除了文件只要没有写入新的文件你还能将它找回来的原因。
重复释放内存报错的原因是因为这些内存已经标记为未分配,就不再有记录了,所以再次释放标准库就会丢出异常。

=====

尚未验证,不过应该free应该不是想象的那么简单。涉及到内存管理的问题

另外,如果打开verifier,就可以第一时间,在内存写越界的时候就爆出这个问题,而不是到释放的时候才报错。这也是个好方法。

 

以上是关于memory corruption的主要内容,如果未能解决你的问题,请参考以下文章

Memory和Storage有啥区别

@ Buffer.Memory ^和Buffer.Memory有什么区别?

object_store_memory 和 redis_max_memory 有啥关系?

在unittest期间全局禁用joblib.memory缓存

C++11 memory_order_acquire 和 memory_order_release 语义?

C F出现out of memory怎么办