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

时间:2012-04-19 15:35:12

标签: c realloc consistency

我有以下代码在我的开发环境中正常工作,但是当代码移动到生产服务器时,它会给出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;
      } 
  }

1 个答案:

答案 0 :(得分:1)

用Valgrind检查程序。

正如oracle所述实现定义的状态:

Code    Condition               Oracle Error
82111   heap consistency error  SQL-02111
  
      
  • 堆一致性错误

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

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

  •   

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

此处的是为动态变量保留的内存区域。

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

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

你也在malloc上做了一个多余的演员。也许你会在开发与生产环境产生影响的其他地方施放等等。即32比64比特。

  • malloc你malloc CurLen + 1
  • realloc上,您不会额外添加1'\0'?)。

如果这是一个问题,取决于您之后对repetitionOut.value的处理方式。

strlen()不计算终止\0