Ver Mensaje Individual
  #4 (permalink)  
Antiguo 28/05/2013, 05:35
amchacon
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 12 años, 4 meses
Puntos: 28
Respuesta: [Sobrecarga de operadores] Explicación de sobre código

Cita:
Iniciado por Doommarine_Maxi Ver Mensaje
Al utilizar new, ¿Simplemente se reserva más espacio en la memoria sin afectar a los datos que hay en ella?, es decir, ¿Todos los datos que hay en "cad" siguen intactos con la diferencía que ahora tengo más espació en los arrays verdad?, ¿como un "realloc"?.

Otra cosa, delete [], lo que hace es eliminar la reserva de espació en la memoria y new genera nueva reserva de espació en la memoria dinamica... ¿Todo sin afectar a los datos que había en esos espacios de memoria verdad?.

Simplemente tengo esa duda al ver que usaste delete, luego new y luego concatenaste a cad
No haber, el sistema de memoria es más sencillo que eso. Digamos que sería un malloc simplificado.

El operador new le pide al sistema operativo que le reserve memoria. Si la petición es aceptada, obtienes la dirreción donde se encuentra tu memoria reservada.

De modo que:

Código C++:
Ver original
  1. char* Ejemplo; // puntero
  2.  
  3. Ejemplo = new char[10]; //Pido al sistema operativo 10 bytes
  4.  
  5. Ejemplo = new char[15]; // Vuelvo a pedirle el sistema operativo 15 bytes, obtengo otra dirreción diferente

Esto es un error grave, puesto que ahora mismo tenemos reservada 25 bytes de memoria pero solo tenemos la dirreción de los ultimos 15 bytes, los otros 10 bytes son "memoria perdida" (al sistema operativo le consta como reservada pero como no tenemos su dirreción no podemos usarla).

Si además tenemos datos importantes en esos 10 bytes, también los perderemos (new no maneja los datos, simplemente pide memoria al SO y te devuelve su dirreción).

Por eso en el código, he usado primero delete[] para liberar la memoria anterior y despues he hecho una nueva petición... Aunque ahora que me doy cuenta, se me ha olvidado guardar los datos antes (en una cadena auxiliar por ejemplo).



La verdad esque si voy a redimensionar en tiempo de ejecución. No usaría el delete/new sino la clase vector. Su sintaxis es:

Código C++:
Ver original
  1. vector<tipo> nombre; // Declaración del vector
  2. nombre.push_back(elemento); // Añadir un elemento al vector

Ejemplo:

Código C++:
Ver original
  1. #include <vector>
  2.  
  3. //...
  4.  
  5. vector<int> Numeros; // Vector de enteros
  6. int Buffer;
  7. cout<<"Introduzca elementos hasta que encuentre el cero";
  8.  
  9. do
  10. {
  11.   cin>> Buffer;
  12.   nombre.push_back(Buffer); // añado el numero al vector
  13. } while (Buffer != 0);
  14.  
  15. // Los muestro por pantalla
  16.  
  17. for (int i = 0; i < Numeros.size();i++) // Numeros.size() devuelve el tamaño del vector
  18.    cout<<Numeros[i];
  19.  
  20. Numeros.resize(5); // Modificamos el tamaño del vector, si el vector es más pequeño que cinco se añadirán elementos nulos, en caso contrario se suprimirán los ultimos elementos.
  21.  
  22. vector<int> Cosa;
  23. Cosa = Numeros; // operador = sobrecargado
  24.  
  25. Cosa.pop_back(); // Eliminando el ultimo elemento
  26.  
  27. if (Numeros > Cosa) // Operador > sobrecargado
  28.   cout<<"Hecho";

Para más información:
http://www.cplusplus.com/reference/vector/vector/

Última edición por amchacon; 28/05/2013 a las 05:52