El conjunto de funciones C (malloc, calloc, realloc, free) son operaciones de memoria sin formato. Crearán/modificarán/liberarán un búfer en la memoria, pero la memoria no tendrá ningún tipo y no se invocarán constructores.
C++ no tiene un equivalente de realloc, pero sólo typesafe equivalentes a malloc/libre a través del uso de nuevo/nueva [] y de borrado/delete []. Las versiones C++ adquirirán la memoria del sistema y la inicializarán llamando a los constructores apropiados. Usando delete llamará a los destructores de los objetos y luego liberará la memoria.Las versiones C y C++ no son compatibles, si adquiere memoria con malloc (incluso si llama al constructor in situ en la memoria recibida) no puede liberarlo con delete/delete [] ya que es un comportamiento indefinido.
El uso de realloc en C++ puede ser inseguro, ya que copiará bit a bit los objetos de un área de memoria a la siguiente. Algunas veces sus objetos no se ocuparán adecuadamente de los movimientos de la memoria (digamos que su objeto tiene un atributo y una referencia a él, luego de moverlo en forma de bit la referencia apuntará a la posición anterior en lugar del atributo real). Dentro de vector, cuando la memoria necesita crecer, se adquiere una nueva memoria con new [] y luego todos los objetos son copiados (o copiados) en las nuevas posiciones usando las operaciones apropiadas de C++ antes de eliminar los elementos antiguos.
Siempre vector crece en tamaño (tamaño reservado, no se utiliza el tamaño) se creará una nueva área de memoria completa y movimiento todos los objetos. Por otro lado, realloc solo moverá el bloque de memoria a otra posición si no hay suficiente espacio contiguo después de que el puntero solo crezca. Vectores no disminuya el tamaño. Nunca. Cuando borra los elementos, la memoria reservada aún se mantiene.
Finalmente, hay un mayor nivel de abstracción en vector que en realloc incluso para los tipos de POD (que se pueden mover con construcciones C-safe). El equivalente a vector sería una estructura que contiene el puntero al búfer de memoria, un recuento de elementos usados y reservados (tamaño de búfer) y el conjunto de funciones que tratan de adquirir más memoria según sea necesario y actualizar los índices con cada operación .
realloc no funcionará con nada más que tipos de POD, ya que no conoce constructores/destructores. El vector – lothar
también tiene la ventaja sobre la memoria de malloc en que se eliminarán cuando salgan del alcance, disminuyendo así las pérdidas de memoria cuando se lanzan excepciones, cuando se olvida de liberar() la memoria, etc. –
@dirkgently Enlace roto, puede usted actualiza por favor? –