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

C/Pro*C中的堆一致性错误,c,realloc,consistency,C,Realloc,Consistency,我有以下代码,在我的开发环境中运行良好,但当代码移动到生产服务器时,会给oracle带来“堆一致性错误”。 你能告诉我如何调试这个和原因吗 if (TagValue[TagTable[TagLoc].Ptr2ValueTable].repetitionOutValue.length==-1) { TagValue[TagTable[TagLoc].Ptr2ValueTable].repetitionOutValue.value = (char*) mal

我有以下代码,在我的开发环境中运行良好,但当代码移动到生产服务器时,会给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;
      } 
  }

用Valgrind检查程序

如本实施定义状态所述:

代码条件Oracle错误 82111堆一致性错误SQL-02111
  • 堆一致性错误

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

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

Tho;如果这是一个巨大的代码,从来没有通过任何检查运行-我不羡慕你前面的任务

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

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

必须在连接之前设置,一旦设置,则无法清除。默认为0/off

您还可以在malloc上执行冗余强制转换。也许您可以在开发与生产环境之间产生影响的其他地方进行铸造等。即32位对64位

  • malloc
    上,您可以选择malloc
    CurLen
    +
    1
  • realloc
    上,不添加额外的
    1
    (对于
    '\0'
    ?)
如果这是一个问题,则取决于您随后如何处理
repetitionOut.value


strlen()。请注意,每个变量都是初始化的我很抱歉,但我不知道您的代码试图做什么…让我简单介绍一下,如果第一个条件满足,那么第一次使用malloc内存。如果已经分配了内存,那么这是一个重复的情况,所以realloc memoryThank你的符文为你的答复。我添加了+1,但仍然得到一致性错误。当我运行这个程序的单个实例时,它工作得很好。但是,当我运行4个实例时,这个一致性问题会在什么环境下出现?Linux+GCC还是?
Code    Condition               Oracle Error
82111   heap consistency error  SQL-02111