C2M1212 消息

C2M1212 消息指示可能导致内存损坏和其他问题的某种类型的内存问题。 内存损坏可能发生在应用程序代码或操作系统代码中。 该消息仅是诊断消息,但可以是实际问题的指示符。 C2M1212 消息可能是也可能不是其他问题的根源。 如果可能,请清除内存问题。

生成 C2M1212 消息时,传递到 free() 函数的指针的十六进制值将包括在消息描述中。 此十六进制值可提供有关问题来源的线索。 malloc() 函数仅返回以十六进制 0 结尾的指针。 未以十六进制 0 结尾的任何指针从未设置为指向 malloc() 函数保留的存储器,或者由于设置为指向 malloc() 函数保留的存储器而进行了修改。 如果指针以十六进制 0 结束,那么 C2M1212 消息的原因不确定,应该检查调用 free() 的程序代码。

在大多数情况下,来自单级别存储器堆内存管理器的 C2M1212 消息前面有一条 MCH6902 消息。 MCH6902 消息具有指示问题的错误代码。 最常见的错误代码是 2 ,它指示正在释放当前未分配的内存。 此错误代码可能表示下列其中一项:
  • 正在释放尚未分配的内存。
  • 正在再次释放内存。

在某些情况下,内存泄漏会导致单级存储堆变得碎片化,以至于堆控制段已满并且释放失败。 此问题由 MCH6906 消息指示。 在这种情况下,唯一的解决方案是调试应用程序并修复内存泄漏。

堆栈回溯 (请参阅 堆栈回溯) 可用于查找导致问题的代码。 一旦找到代码,困难的部分就是确定指向堆存储器的指针有什么问题。 有几个潜在原因:
  1. 指针从未初始化,并且包含意外的值。 C2M1212 消息转储指针的十六进制值。
  2. 未从 malloc()获取指针。 该指针可能是指向自动 (局部) 变量或静态 (全局) 变量的指针,而不是指向来自 malloc()的堆存储器的指针。
  3. malloc()返回指针后对其进行了修改。 例如,如果从 malloc() 返回的指针增加了一定数量,然后传递到 free(),那么它将无效并发出 C2M1212 消息。
  4. 正在将指针再次传递到 free()。 使用指针调用 free() 后,将取消分配该指针所指向的空间,如果再次调用 free() ,那么将发出 C2M1212 消息。
  5. 堆管理器维护的用于跟踪堆分配的堆结构已损坏。 在这种情况下,该指针是有效指针,但堆管理器无法确定该指针和 C2M1212 消息结果。 当堆结构损坏时,作业记录中通常至少有一条 C2M1211 消息来指示发生了堆损坏。
  6. 如果调试内存管理器正在使用中,并且 C2M1212 消息上的原因码为 X'8000000000 ' ,那么已覆盖给定分配的填充字节。 有关更多信息,请参阅 调试内存管理器