malloc():内存损坏

Posted

tags:

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

这是我认为可能导致此错误的简化程序。

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 ***

什么可能导致这种差异?

答案

什么可能导致这种差异?

基本上,内存分配器一次分配内存页以供程序使用,它会在其中为您指定一个指针(确保以下空间可以免费使用)。由于这些页面通常大于8KiB,因此您的迷你程序没有问题。但是如果一个更大的程序分配更大量的内存并进一步写入已分配空间的末尾,那么你最终会尝试写入未分配的内存(或另一个程序使用的内存!),从而破坏内存。

另一答案

它是undefined behavior,因为你已经分配了8192字节内存,但你正在尝试写9200字节。哪个是出界的。

另一答案

写入尚未分配的内存是未定义的行为。那是因为malloc()会返回你可能写入的一段内存,所以当你写完该区域的末尾时,你会覆盖不属于你的东西。

这可能是malloc本身使用的结构,或者完全不同的东西。

另一答案

这是运气问题。您的操作系统可能会保留超过您请求的8kB的内存。您之前和之后保留的内容可能会对行为产生影响。

不是说你的程序会在缓冲区溢出时崩溃。实际上,行为未定义或实现已定义。

以上是关于malloc():内存损坏的主要内容,如果未能解决你的问题,请参考以下文章

char 指向字符串的指针,然后进入字符串数组。 *** `./a.out' 中的错误:malloc():内存损坏:0x0900c3b0 ***

libtorrent-rasterbar 和 QGuiApplication 导致内存损坏

损坏的顶点和片段着色器

GuardMalloc 导致虚拟内存耗尽

在一台内存为2G的机器上,malloc(20G) 会怎样?如果是new(20G) 会怎样?

malloc中的电子围栏段错误