dynamic — ошибка времени выполнения C ++ в Linux :: обнаружен glibc free (): неверный следующий размер (быстрый): стек с элементом void ptr

Это мой первый вопрос, поэтому я прошу прощения, если это слишком глупо. Я попытался выполнить поиск и все еще не смог найти проблему с кодом. Я отлаживаю чей-то код, который выдает эту ошибку в Linux, и он отлично работает в Solaris.

*** glibc detected ***  free(): invalid next size (fast): 0x096c72b0 ***
======= Backtrace: =========
/lib/libc.so.6[0xa986c5]
/lib/libc.so.6(cfree+0x59)[0xa98b09]
...

Код огромен с большой внутренней логикой, но я попытался создать пример того, где проблема может быть ..

Typedef Struct _FIELD
{
Int  size;
Char str[25];
Void *pData;
Void *pValue;
}FIELD;

Class ABC
{
FIELD * field1;
FIELD* getFIeld(int);
…}

ABC::ABC()
{
field1=NULL;
}
ABC::~ABC()
{
for (int I = 0; I < total_num; i++)
{
free (field1[i].pData);
free(field1[i],pValue);
}
free(field1);
}

FIELD* ABC::getField(int total_num)
{
FIELD *pFields = NULL;
pFields = GetValues( total_num);//just sets up pFields

field1 = malloc ( total_num * sizeof(FIELD));
for (int i =0 ; i<total_num; i++)
{
// earlier this code was memcpy, memcpy(&field1, &pFields, sizeof(FIELD)) I have       changed this to explicit copy
Strcpy(field1[i].str, pFields[i].str);
field1[i].size = pFields[i].size;
field1[i].pData = malloc(fields[i].size);
field1[i].pValue = malloc(fields[i].size);
//I am not doing strdup for pData and PValue as I checked they are null at this point.
}
free(pFields);
return(field1);

}
…
//Main
FIELD* field1 = NULL;

……
field1 = getField(n);
…….

field1 =getField(n)
…

Я снова хотел бы извиниться, если это очевидно.

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

Спасибо!

0

Решение

Возможно, у вас где-то переполнение буфера. Сообщение об ошибке, которое вы получаете от glibc, указывает, что куча была повреждена, обычно перезаписывая внутренние записи, которые отслеживают используемые и свободные блоки. glibc очень настойчиво пытается обнаружить ошибки такого рода, в большей степени, чем другие платформы; у вас, вероятно, есть такая же ошибка в другом месте, но libc не обнаруживает ее.

Что касается именно того, где находится ошибка, я не вижу ее непосредственно в вашем коде, но этот код делает довольно много предположений (таких как предварительное распределение буферов размера, записанного в структуре данных) и остальной части программы может не следовать этим предположениям.

Короткая версия: я бы установил valgrind и запустил вашу программу под ним. Это отладчик оперативной памяти для UNIX, который сообщит вам, когда вы написали после окончания выделенной памяти, и какая строка кода имеет эту проблему. Это первое, чего нужно достичь в такой проблеме.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]