2015-08-11 7 views
0

Я получаю ошибку sysmalloc ниже при запуске программы на C.C Сбой ошибки Sysmalloc

malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) 
&((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) 
&& old_size == 0) || ((unsigned long) (old_size) >= (unsigned long) 
((((__builtin_offsetof (struct malloc_chunk, fd_nextsize)) 
+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) 
&& ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed. 

Программа прекрасно работает при использовании Int массив

int(*M)[cnt] = malloc(sizeof(int[cnt][cnt])); 

но показывает вышеуказанную ошибку для знакового длинного междунар. В программе нет других изменений.

signed long int(*M)[cnt] = malloc(sizeof(signed long int[cnt][cnt])); 

В чем может быть причина? Это отлично работало при использовании массива int. Следовательно, не должно быть проблемой управления памятью, как указано здесь C Malloc assertion failure

Благодарности

+1

Что такое 'cnt'? Вы используете 32 или 64-битную систему? Что такое 'sizeof (int)' и 'sizeof (long)' в вашей системе? – mch

+0

Возможный дубликат [Почему я получаю сообщение об ошибке C malloc?] (Http://stackoverflow.com/questions/2987207/why-do-i-get-ac-malloc-assertion-failure) –

+0

@mch: cnt представляет собой целочисленную переменную, сохраняющую некоторое значение. Я на 64-битной системе. 'sizeof (int)' is 4 и 'sizeof (long)' равно 8. – re3el

ответ

1

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

Эти внутренние данные часто размещаются до и/или после выделенных блоков. Если что-то не так, это означает, что ваш код, который был выполнен до этого malloc(), писал за пределами ранее выделенного блока.

EDIT: Выполнение поиска в google для Assertion (old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - напрямую привело меня к this. Разве вы не искали Google?

+0

yup. Я обыскал и проверил этот ответ. Это не помогло моей проблеме. Если бы это был случай, упомянутый в другом ответе, он не должен работать и для массива int. – re3el

+1

Нехороший вывод, потому что такие проблемы могут появляться и исчезать в зависимости от того, где размещены выделенные блоки или насколько они растягиваются. Ошибка программирования может быть в совершенно другом и, казалось бы, несвязанном месте, но факт в том, что ваш код пишет, где он не должен. –

0

Мой собственный опыт, который может помочь: Это определенно сбой из-за некоторой динамически распределенной памяти, которая используется неправильно (например, из привязки). Трудность состоит в том, что отказ может не произойти в точности в той строке, где происходит за пределами.

Например, это был мой код:

int func(const int n) { 
    int *a = new int[n]; // * sizeof(int) 
    for (int i = 0; i < n; ++i) 
     a[i] = 1; 

    // This line causes the sysmalloc assertion failure 
    vector<int> tv(10); 
} 

Теперь сбой происходит, когда память выделяется для tv, но реальная проблема заключается в том, что я забыл * sizeof(int) при выделении памяти и, следовательно, в петле, пишет в нераспределенных адресах памяти.

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