编译器如何检测内存损坏 最近,当我在C++项目上工作时,我忘记了重新初始化一个计数器变量,它是用来在运行时访问一个动态分配的数组。

编译器如何检测内存损坏 最近,当我在C++项目上工作时,我忘记了重新初始化一个计数器变量,它是用来在运行时访问一个动态分配的数组。,c++,memory-management,compiler-errors,C++,Memory Management,Compiler Errors,正如所料,程序在执行时崩溃,错误如下: “glibc检测到malloc():内存损坏” 现在我知道new/malloc从堆中分配了一些额外的内存字节用于记账。然而,让我感兴趣的是,编译器检测到我已经在不应该在的地方编写了一些数据。你知道编译器是如何做到这一点的吗 是C库在向您抱怨;不是编译器。具体来说,它是GNUC库中的malloc实现 第3738行就是它发出这种错误的地方 您必须检查库源代码以查看发生了什么。但是,不同的库表现不同。它们以不同的方式分配内存,可能会也可能不会进行完整性检查。它

正如所料,程序在执行时崩溃,错误如下:

“glibc检测到malloc():内存损坏”


现在我知道new/malloc从堆中分配了一些额外的内存字节用于记账。然而,让我感兴趣的是,编译器检测到我已经在不应该在的地方编写了一些数据。你知道编译器是如何做到这一点的吗

是C库在向您抱怨;不是编译器。具体来说,它是GNUC库中的malloc实现

第3738行就是它发出这种错误的地方


您必须检查库源代码以查看发生了什么。但是,不同的库表现不同。它们以不同的方式分配内存,可能会也可能不会进行完整性检查。

它不是编译器,而是libc实现。它在分配的内存块前后写入神奇的数字42(生命、宇宙和一切的答案)。有可能的是,如果某个东西在内存中乱涂乱画,它就不是生命、宇宙或一切的答案,因此glibc可以简单地检查生命、宇宙和一切的答案是否仍然在它应该在的地方,如果没有,它一定已经损坏了。编译器不会。这是一个运行时错误,由您使用的标准库实现(
glibc
)中的内存分配器检测到。它通常通过在分配的内存之前和之后将一些额外字节设置为特定值,并在
free
上检查这些字节来实现。注意,在某些情况下,它可能无法检测到损坏。不要指望它每次都会发生。@SamVarshavchik,这是一个讽刺。