Кросс-платформенное приложение «programname», которое работает под windows, но начало валиться с таким сообщением под linux:
programname: malloc.c:3097: 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.
Эксперимент показал, что если убрать в одном месте ОДНОКРАТНЫЙ вызов «char *t = new char[1024]», то всё становится хорошо. Или если заменить «1024» на «1024*1024», то всё становится тоже хорошо.
Перед этим «new char[1024]» делается после нескольких сотен new + delete на небольшой объём памяти каждая (байт 60).
В чём может порыться собака? У меня слишком много мелких выделений и освобождений памяти? Несколько сотен мелких выделений и освобождений памяти оказывается достаточно, чтобы убить фрагментацией 3 гига свободной памяти?