El redimensionamiento en C++ es incómodo debido a la posible necesidad de llamar a constructores y destructores.
No creo que hay una razón fundamental por la cual en C++ no se podría tener un operador de resize[]
ir con new[]
y delete[]
, que hizo algo parecido a esto:
newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;
Obviamente oldsize
serían recuperados desde un lugar secreto, lo mismo está en delete[]
, y Type
vendría del tipo del operando. resize[]
fallaría donde el tipo no se pueda copiar, lo que es correcto, ya que dichos objetos simplemente no se pueden reubicar. Finalmente, el código anterior predeterminado: construye los objetos antes de asignarlos, lo que no le gustaría como el comportamiento real.
Hay una posible optimización en newsize <= oldsize
, para llamar a los destructores de los objetos "pasados el final" de la nueva matriz ensmallened y no hacer nada más.El estándar debería definir si esta optimización es necesaria (como cuando resize()
un vector), permitido pero no especificado, permitido pero dependiente de la implementación, o prohibido.
La pregunta que debe hacerse entonces es: "¿es realmente útil proporcionar esto, dado que vector
también lo hace, y está diseñado específicamente para proporcionar un contenedor redimensionable (de memoria contigua, ese requisito omitido en C++ 98 pero arreglado en C++ 03) que es un mejor ajuste que las matrices con las formas C++ de hacer las cosas? "
Creo que la respuesta es ampliamente cree que es "no". Si desea hacer un búfer redimensionable de la manera C, use malloc/free/realloc
, que están disponibles en C++. Si desea hacer un búfer redimensionable al estilo C++, use un vector (o deque
, si realmente no necesita almacenamiento contiguo). No intente mezclar los dos utilizando new[]
para buffers sin formato, a menos que esté implementando un contenedor similar a un vector.
Stroustrup respondió esto hace mucho tiempo, mira: http://www2.research.att.com/~bs/bs_faq2.html#renew (Es un buen comienzo si eres nuevo en C++ junto con las preguntas frecuentes de C++ de Cline.) – dirkgently
La respuesta a la que hace referencia @dirkgently ahora está en: http://www.stroustrup.com/bs_faq2.html#renew - y las preguntas frecuentes de Cline ahora son parte de las preguntas más frecuentes: https://isocpp.org/faq – maxschlepzig