C2M1212 消息
C2M1212 消息指示可能导致内存损坏和其他问题的某种类型的内存问题。 内存损坏可能发生在应用程序代码或操作系统代码中。 该消息仅是诊断消息,但可以是实际问题的指示符。 C2M1212 消息可能是也可能不是其他问题的根源。 如果可能,请清除内存问题。
生成 C2M1212 消息时,传递到 free() 函数的指针的十六进制值将包括在消息描述中。 此十六进制值可提供有关问题来源的线索。 malloc() 函数仅返回以十六进制 0 结尾的指针。 未以十六进制 0 结尾的任何指针从未设置为指向 malloc() 函数保留的存储器,或者由于设置为指向 malloc() 函数保留的存储器而进行了修改。 如果指针以十六进制 0 结束,那么 C2M1212 消息的原因不确定,应该检查调用 free() 的程序代码。
在大多数情况下,来自单级别存储器堆内存管理器的 C2M1212 消息前面有一条 MCH6902 消息。 MCH6902 消息具有指示问题的错误代码。 最常见的错误代码是 2 ,它指示正在释放当前未分配的内存。 此错误代码可能表示下列其中一项:
- 正在释放尚未分配的内存。
- 正在再次释放内存。
在某些情况下,内存泄漏会导致单级存储堆变得碎片化,以至于堆控制段已满并且释放失败。 此问题由 MCH6906 消息指示。 在这种情况下,唯一的解决方案是调试应用程序并修复内存泄漏。
堆栈回溯 (请参阅 堆栈回溯) 可用于查找导致问题的代码。 一旦找到代码,困难的部分就是确定指向堆存储器的指针有什么问题。 有几个潜在原因:
- 指针从未初始化,并且包含意外的值。 C2M1212 消息转储指针的十六进制值。
- 未从
malloc()获取指针。 该指针可能是指向自动 (局部) 变量或静态 (全局) 变量的指针,而不是指向来自malloc()的堆存储器的指针。 - 从
malloc()返回指针后对其进行了修改。 例如,如果从malloc()返回的指针增加了一定数量,然后传递到free(),那么它将无效并发出 C2M1212 消息。 - 正在将指针再次传递到
free()。 使用指针调用free()后,将取消分配该指针所指向的空间,如果再次调用free(),那么将发出 C2M1212 消息。 - 堆管理器维护的用于跟踪堆分配的堆结构已损坏。 在这种情况下,该指针是有效指针,但堆管理器无法确定该指针和 C2M1212 消息结果。 当堆结构损坏时,作业记录中通常至少有一条 C2M1211 消息来指示发生了堆损坏。
- 如果调试内存管理器正在使用中,并且 C2M1212 消息上的原因码为 X'8000000000 ' ,那么已覆盖给定分配的填充字节。 有关更多信息,请参阅 调试内存管理器 。