2012-04-19 3 views
0

У меня есть следующий код, который отлично работает в моей среде разработки, но когда код перемещается на рабочий сервер, он дает оракул «Ошибка согласования кучи». Не могли бы вы дать мне знать, как отладить это и повод для этого?Ошибка согласования кучи в C/Pro * C

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; 
     } 
    } 
+3

Показать код! – Nick

+0

спасибо за ответ.код добавлен. Обратите внимание, что каждая переменная инициализирована – QMG

+1

Прошу прощения, но я понятия не имею, что ваш код пытается сделать ... – Nick

ответ

1

Проверьте программу с Valgrind.

Как oracle говорят, для этого реализации определенных статус:

 
Code Condition    Oracle Error 
82111 heap consistency error SQL-02111 
  • Heap консистенция ошибка

  • Это внутренняя ошибка, как правило, указывает на ошибку памяти, связанные с.

  • Проверьте программу на наличие ошибок, связанных с памятью, таких как недействительные указатели или массив оценки нарушений.

Тхо; Если это огромный код, который никогда не проходил никаких проверок, я не завидую вам перед этой задачей.

куча, здесь, это область памяти зарезервирована для динамических переменных.

Чрезмерная проверка кучи также является параметром времени исполнения, включенным ORAHCHF. Если set указывает библиотеке времени выполнения Oracle проверять кучу на согласованность каждый раз, когда прекомпилятор динамически выделяет или освобождает память.

Должен быть установлен до CONNECT и после его установки не может быть очищен. По умолчанию 0/off.

Вы также делаете избыточный бросок на malloc. Возможно, вы бросаете и т. Д., Где-то в другом месте, где эффект разработки или производственной среды. То есть 32 против 64 бит.

  • На malloc вы таНос CurLen + 1
  • На ваш realloc вы не добавляете дополнительные 1 (для '\0'?).

Если это проблема, это зависит от того, что вы делаете с repetitionOut.value.

strlen() не считает завершающим \0.

+0

Спасибо, Руне за ответ.Я добавил +1, но все еще получаю ошибку согласованности. Когда я запускаю один экземпляр программы, он отлично работает. Но когда я запускаю 4 экземпляра, проблема с этой непротиворечивостью поднялась – QMG

+0

Какая среда? Linux + GCC или? – Morpfh

Смежные вопросы