O redimensionamento em C ++ é estranho devido à necessidade potencial de chamar construtores e destruidores.
Não acho que haja uma razão fundamental pela qual em C ++ você não poderia ter um resize[]
operador para acompanhar new[]
e delete[]
, isso fez algo semelhante a isto:
newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;
Obviamente, oldsize
seria recuperado de um local secreto, mesmo que estivesse delete[]
, e Type
viria do tipo do operando. resize[]
falharia onde o tipo não é copiável - o que é correto, uma vez que tais objetos simplesmente não podem ser realocados. Finalmente, o código acima constrói os objetos por padrão antes de atribuí-los, o que você não gostaria que fosse o comportamento real.
Há uma possível otimização em newsize <= oldsize
que chamar destruidores para os objetos "além do final" do array recém-formado e não fazer mais nada. O padrão teria que definir se essa otimização é necessária (como quando você resize()
usa um vetor), permitida mas não especificada, permitida mas dependente da implementação ou proibida.
A pergunta que você deve fazer a si mesmo é: "é realmente útil fornecer isso, visto que vector
também o faz, e é projetado especificamente para fornecer um contêiner redimensionável (de memória contígua - esse requisito omitido em C ++ 98, mas corrigido em C ++ 03) é um ajuste melhor do que arrays com as formas de C ++ de fazer as coisas? "
Acho que a resposta é amplamente considerada "não". Se você quiser fazer buffers redimensionáveis à maneira C, use malloc / free / realloc
, que estão disponíveis em C ++. Se você quiser fazer buffers redimensionáveis da maneira C ++, use um vetor (ou deque
, se você realmente não precisa de armazenamento contíguo). Não tente misturar os dois usando new[]
buffers brutos, a menos que esteja implementando um contêiner semelhante a um vetor.