C/Pro*C中的堆一致性错误
我有以下代码,在我的开发环境中运行良好,但当代码移动到生产服务器时,会给oracle带来“堆一致性错误”。 你能告诉我如何调试这个和原因吗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
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
- 堆一致性错误
- 此内部错误通常表示与内存相关的错误
- 检查程序是否存在与内存相关的错误,例如无效指针或数组边界冲突
ORAHCHF
启用的运行时选项。If set告诉Oracle运行库在每次预编译器动态分配或释放内存时检查堆的一致性
必须在连接之前设置,一旦设置,则无法清除。默认为0/off
您还可以在malloc上执行冗余强制转换。也许您可以在开发与生产环境之间产生影响的其他地方进行铸造等。即32位对64位
- 在
上,您可以选择mallocmalloc
+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