我有以下代码在我的开发环境中运行良好,但是当代码移动到生产服务器时,它会给出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
你 mallocCurLen
+1
- 在您的
realloc
上,您不会添加额外的1
(对于' '
?
这是否是一个问题取决于您之后如何处理repetitionOut.value
。
strlen()
不计算终止