Действительно ли перевыделение освобождает бывший буфер, если это перестало работать?

Taras Glek Mozilla работал в прошлом году или два согласно анализу C++ и инструментам перезаписи кода. Его блог в http://blog.mozilla.com/tglek/ , можно найти ссылки на инструменты, которые они создали там. Они, конечно, свободны и с открытым исходным кодом. Никакой GUI, но я думал, что свяжу его в случае, если это интересно кому-либо.

28
задан ja.ro 22 October 2009 в 12:56
поделиться

3 ответа

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

if ((buff = realloc (buff, newsize)) == NULL)
    return;

в своем коде, если вы хотите, чтобы освободил оригинал в случае ошибки. Вместо этого вы должны сделать что-то вроде:

if ((newbuff = realloc (buff, newsize)) == NULL) {
    free (buff);
    return;
}
buff = newbuff;

Конечно, указанный размер. В противном случае, если ptr не соответствует указателю, ранее возвращенному calloc , malloc или realloc , либо если пространство было освобождено вызовом для функции free или realloc поведение не определено. Если память на новый объект не может быть выделен, старый объект не освобожден, и его значение не изменилось.

29
ответ дан 28 November 2019 в 03:38
поделиться

realloc () возвращает указатель на вновь выделенную память, которая соответствующим образом выровнена для любого типа переменной и может отличаться от ptr или ] NULL , если запрос не выполняется. Если size был равен 0, возвращается либо NULL , либо указатель, пригодный для передачи в free () . Если realloc () дает сбой, исходный блок остается нетронутым; он не освобождается и не перемещается.

malloc (3) - Справочная страница Linux

5
ответ дан 28 November 2019 в 03:38
поделиться

Нет. Если realloc () не удалось изменить предыдущий буфер.

man realloc (3) :

realloc () возвращает указатель на новый выделенная память, которая подходит выровнен для любого типа переменной и может отличаться от ptr или NULL , если запрос не выполняется. Если размер был равен 0, либо NULL , либо указатель, подходящий для передано в free () возвращается. Если realloc () дает сбой, исходный блок остается нетронутый; он не освобождается и не перемещается.

2
ответ дан 28 November 2019 в 03:38
поделиться
Другие вопросы по тегам:

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