*** glibc обнаружен *** realloc (): недопустимый старый размер - PullRequest
0 голосов
/ 04 января 2012

Проблемы с realloc ().Я получил * обнаруженный glibc * realloc (): недопустимый старый размер

void reallocatePtrTable(mmUctNode* nodeToReallocate){
 int newSize = (nodeToReallocate->PtrTableCapacity)*INCREASE_FACTOR;
 printf("(re)Allocating %p with %d bytes. ",nodeToReallocate->childPtrTable,sizeof(mmUctNode*)*newSize);
 nodeToReallocate->childPtrTable=
     (mmUctNode**)realloc(nodeToReallocate->childPtrTable,sizeof(mmUctNode*)*newSize);
 printf(" Got %p\n",nodeToReallocate->childPtrTable);
if(!nodeToReallocate->childPtrTable){
    puts("Re-allocation failed");
    exit(-1);
   }
}

Я убедился, что не перераспределяю нулевые или неправильные указатели.Первоначальное выделение памяти осуществляется функцией malloc ()

(re)Allocating 0x8801fc8 with 480 bytes.  Got 0x8807a98
(re)Allocating 0x8807a98 with 960 bytes.  Got 0x880d2b8
(re)Allocating 0x880d2b8 with 1920 bytes.  Got 0x8818290
(re)Allocating 0x8818290 with 3840 bytes.  Got 0x882e310
(re)Allocating 0x882e310 with 7680 bytes.  Got 0x885a410
(re)Allocating 0x885a410 with 15360 bytes.  Got 0x88b9018
(re)Allocating 0x88b9018 with 30720 bytes. *** glibc detected ***     /home/: realloc(): invalid old size: 0x088b9018 ***
Segmentation fault

Ответы [ 2 ]

4 голосов
/ 04 января 2012

Вы, вероятно, случайно переписали mallocs внутренние данные бухгалтерского учета, например, через переполнение буфера. Обычно это называется «повреждением памяти».

1 голос
/ 05 января 2012

Вы не можете написать так:

nodeToReallocate->childPtrTable =
     (mmUctNode**)realloc(nodeToReallocate->childPtrTable,sizeof(mmUctNode*)*newSize);

вы должны объявить временный указатель так:

mmUctNode **ptr; 

и затем:

if(!(ptr = (mmUctNode**)realloc(nodeToReallocate->childPtrTable,sizeof(mmUctNode*)*newSize))){
    //.... free old objects code
    puts("Re-allocation failed");
    exit(-1);
}
else nodeToReallocate->childPtrTable = ptr;
...