Есть ли какие-либо гарантии, что realloc() всегда будет сжимать буфер на месте? Чтобы следующее:
new_ptr = (data_type *) realloc(old_ptr, new_size * sizeof(data_type));
всегда будет давать new_ptr == old_ptr, если new_size < old_size (за исключением, конечно, new_size == 0). Кажется разумным (для меня), что он будет работать таким образом, но было любопытно, соблюдал ли стандарт его.
Я рассматриваю перераспределение массивов типов данных, отличных от POD, и, если вышеприведенное поведение было гарантировано, было подумано, что следующая стратегия может по крайней мере обеспечить эффективное "сжатие":
if (new_size > old_size)
{
// malloc() a new buffer
// use placement copy constructor to copy old objects over
// free() old buffer
}
else
if (new_size < old_size)
{
// explicit destruction of unneeded objects
// realloc() buffer
}
Я ожидаю, что "усадка" на месте будет надежной, даже если тип данных имеет собственные ссылки/указатели или что-то еще...