现象 Link to heading

在某处进行内存申请或释放时,会提示内存崩溃(memory corrpution)(windows 系统)。申请或释放内存使用的是 malloc 或是简单的 new T[n]

遇到的场景 Link to heading

在高性能计算时,可能会大量使用指针及相关偏移来进行访问以减少索引的计算等因素。但 如果出现访问内存非法时则会出现各类错误,常见错误如 linux 下的段错误或是 winodws 下的 0xC0000005(访问出错)。 然而有时并仅仅是写入而不读取则不会立刻报错,而是在后续其它内存相关操作(如申请、 释放内存)时才会出现错误(即本文出现的情况)。

原因 Link to heading

出现问题的地方并不是申请与释放内存之处,而是这之前通过指针写向了非法内存空间。因 为操作系统是以页为单位对内存进行管理的,当写入内存而没有进行读取时,Windows 并不 是会判断地址的合法性,而是会直接对内存进行写入。但当下一次出现对内存操作时,则会 因为上次操作的非法而导致内存验校失败,从而内存崩溃。其根本原因是由于操作系统对内 存管理与检查的策略导致了此错误报告的延后。