这是我认为可能导致此错误的简化程序。
char *p = (char*)malloc(8192);
for(int i = 0; i < 9200; ++i){
p[i] = '1';
}
char *s = (char*)malloc(strlen(p));
原来的项目比较复杂,所以我把它简化了。我使用 malloc 分配了 8192 个字节。然后我的程序将向数组中写入超过 8192 个字符。然后我将使用 malloc 分配内存。
这个小程序没有崩溃。但是在原来的大项目中,它会因为这个错误而崩溃:
malloc():内存损坏:0x0000000007d20bd0 ***
什么可能导致这种差异?
原文由 Yuan Wen 发布,翻译遵循 CC BY-SA 4.0 许可协议
基本上,内存分配器一次分配内存 页面 供程序使用,并在其中为您提供一个指针(确保以下空间可供使用)。由于这些页面通常大于 8KiB,因此您的小程序没有问题。但是,如果一个更大的程序正在分配更多的内存并且写入越过分配空间的末尾,那么您最终将尝试写入未分配的内存(或另一个程序使用的内存!),从而破坏内存。