Olej
@Olej
инженер, программист, преподаватель

В чём ошибка free, delete?

Что-то вот такое:
char *sval = (char*)calloc( zn, sizeof( char ) );
for( ... ) {
   // здесь что-то заполняется  эту строку
}
free( (void*)sval );

Ошибка:
*** Error in `./period1': free(): invalid next size (fast): 0x09413040 ***
Аварийный останов

Только не надо мне писать школярские глупости про "освобождение не размещённой памяти" и т.п.
Про подобные вещи пишут довольно много (поиском): free(): invalid next size (fast) и мн. др. ... и все после середины 2012г. и далее, и C и C++.
Компилятор GCC 4.8.4
Что может значить такое сообщение об ошибке?

P.S. И что удивляет: если в free есть преобразование void*, то иногда это проканывает (не всегда), без преобразования - всегда ошибка.
  • Вопрос задан
  • 1365 просмотров
Решения вопроса 1
Olej
@Olej Автор вопроса
инженер, программист, преподаватель
Нашлась ошибка: в цикле залез (записью 0) в строке на 1 байт дальше длины zn, при этом затирается дескриптор длины следующей области памяти, и при освобождении невозможно восстановить (объединить) свободные регионы.

И вот именно поэтому, при разных уровнях оптимизации (-O0, ... -O3) сообщения об ошибке носят совершенно разный характер ... что может свести с ума.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
// здесь что-то заполняется эту строку
Здесь поподробнее. Вы могли внутри цикла изменить указатель sval
Ответ написан
Лучше всего делать так:

char * const sval = (char*)calloc( zn, sizeof( char ) );


И тогда вы в цикле не ошибётесь (обнаружится на этапе компиляции).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы