C/Pro*C 中的堆一致性错误



我有以下代码在我的开发环境中运行良好,但是当代码移动到生产服务器时,它会给出oracle"堆一致性错误"。你能告诉我如何调试这个以及这样做的原因吗?

if (TagValue[TagTable[TagLoc].Ptr2ValueTable].repetitionOutValue.length==-1)
{
                TagValue[TagTable[TagLoc].Ptr2ValueTable].repetitionOutValue.value
     = (char*) malloc (*CurLen+1)   ;
}
else
{
             more_val2 = (char*) realloc (TagValue[TagTable[TagLoc].Ptr2ValueTable].repetitionOutValue.value
             , (strlen(TagValue[TagTable[TagLoc].Ptr2ValueTable].repetitionOutValue.value)+(*CurLen)) * sizeof(char));
      if (more_val2!=NULL) 
      {
      TagValue[TagTable[TagLoc].Ptr2ValueTable].repetitionOutValue.value=more_val2;
      } 
  }

用瓦尔格林德检查程序。

正如预言机对这种实现定义的状态所说:

代码条件预言机错误82111 堆一致性错误 SQL-02111
  • 堆一致性错误

  • 此内部错误通常表示与内存相关的错误。

  • 检查程序是否存在与内存相关的错误,例如无效指针数组边界冲突

寿;如果这是一个巨大的代码,从未经过任何检查 - 我不羡慕你面前的任务。

这里的是为动态变量保留的内存区域。

过多的堆验证也是 ORAHCHF 启用的运行时选项。如果 set 告诉 Oracle 运行时库在每次预编译器动态分配或释放内存时检查堆的一致性。

必须在CONNECT之前设置,一旦设置,就无法清除。默认为 0/关闭。

您还会在 malloc 上进行冗余投射。也许您在开发与生产环境有影响的其他地方投射等。即 32 与 64 位。

  • 在你malloc你 malloc CurLen + 1
  • 在您的realloc上,您不会添加额外的1(对于''

这是否是一个问题取决于您之后如何处理repetitionOut.value

strlen()不计算终止

最新更新