es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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, como std::string. Cuando asignamos memoria para un arreglo dinámico de objetos std::string, también se asigna memoria para los objetos y se llama al constructor de los mismos. Cuando intentamos realocar el arreglo usando realloc, 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 operadores new y delete para asignar y liberar memoria, respectivamente. Alternativamente, podemos utilizar los contenedores de C++ como std::vector, que proporcionan una forma más segura de manejar arreglos dinámicos.

Comments are closed.