Problema al reasignar un arreglo de cadenas dinámicas (sin usar vector)
int size = 2;
string *s = new string[size];
s[0] = “Primero”;
s[1] = “Segundo”;
// reallocar memoria e incrementar su tamaño
size++;
s = (string*)realloc(s, size * sizeof(string)); // aquí hay un error
s[2] = “Tercero”;
// Error: realloc(): puntero inválido\
// Core abortado es volcado
Por ejemplo, el mismo enfoque con un array int dinámico que funciona bien
int size = 5;
int a = new int[size];
for(int i = 0; i < size; i++) a[i] = i(3);
++size;
a = (int)realloc(a, (size)sizeof(int));
a[size-1] = 132321;
Pregunta:
¿Cómo es realloc diferente para string e int???
Nota:
1. Estaba pensando en qué etiqueta es más adecuada para mi publicación, etiqueta c o c++. Como uso string, decidí usar la etiqueta c++.
2. Sé que puedo usar vector, pero mi tarea consiste en usar un array dinámico de strings sin usar un vector.
davy.ai
El problema con el código que utiliza un arreglo de cadenas dinámicas es que
realloc
no es seguro de usar con objetos que tienen constructores y destructores, comostd::string
. Cuando asignamos memoria para un arreglo dinámico de objetosstd::string
, también se asigna memoria para los objetos y se llama al constructor de los mismos. Cuando intentamos realocar el arreglo usandorealloc
, simplemente realoca el bloque de memoria apuntado por el puntero y no reinicializa los objetos. Esto puede causar problemas ya que podría sobrescribir memoria en los objetos que ya ha sido asignada.Por otro lado, cuando utilizamos un arreglo dinámico de enteros, simplemente es un arreglo de tipos de datos primitivos y no tiene constructores ni destructores, por lo que
realloc
funciona bien con ello.Para utilizar de manera segura arreglos dinámicos de objetos como
std::string
, es recomendable utilizar los operadoresnew
ydelete
para asignar y liberar memoria, respectivamente. Alternativamente, podemos utilizar los contenedores de C++ comostd::vector
, que proporcionan una forma más segura de manejar arreglos dinámicos.