• Domingo 15 de Diciembre de 2024, 16:35

Autor Tema:  Una Duda Con Delete  (Leído 1305 veces)

Perrero

  • Miembro MUY activo
  • ***
  • Mensajes: 209
    • Ver Perfil
Una Duda Con Delete
« en: Lunes 8 de Enero de 2007, 19:29 »
0
Tengo una duda en la parte final de este codigo (en lo q esta comentado)


Código: Text
  1.  
  2. void Agregar_Palabra(TEntradaDiccionario Diccionario[], int *cont)
  3. {
  4.    TEntradaDiccionario miDiccionario;
  5.  
  6.    if (*cont<MAX)
  7.    {
  8.       miDiccionario.esp = new char[50];
  9.       miDiccionario.ing = new char[50];
  10.  
  11.       do
  12.       {  flushall();
  13.          printf("\nIngrese la palabra en espanol: ");
  14.          gets(miDiccionario.esp);
  15.          flushall();
  16.          printf("Ingrese la palabra en ingles: ");
  17.          gets(miDiccionario.ing);
  18.       }  while (Buscar_Palabra(Diccionario,miDiccionario,*cont)==1);
  19.    }
  20.  
  21.    (*cont)++;
  22.    Diccionario[*cont] = miDiccionario;
  23.  
  24.   /* delete [] miDiccionario.esp;
  25.    delete [] miDiccionario.ing;        */
  26. }
  27.  

Xq no deben de ir los delete, ya que cuando los pongo pone basura al arreglo ¿Acaso la estructura (miDiccionario) ya no fue guardada en una celda del arreglo y por ende se puede eliminar?  <_<

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Una Duda Con Delete
« Respuesta #1 en: Lunes 8 de Enero de 2007, 19:51 »
0
Si y no. Diccionario[] tiene miDiccionario pero no tiene una copia de sus miembros que son punteros sino que tiene esos valores.

Diccionario[].esp y Diccionario[].eng son dos punteros que valen lo mismo que miDiccionario, en cuanto liberas la memoria a la que apuntan esos punteros deja de ser valida ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Perrero

  • Miembro MUY activo
  • ***
  • Mensajes: 209
    • Ver Perfil
Re: Una Duda Con Delete
« Respuesta #2 en: Lunes 8 de Enero de 2007, 20:25 »
0
Una pregunta ¿xq tienen la misma direccion de memoria? es por

Código: Text
  1. Diccionario[*cont] = miDiccionario;
  2.  

y en esta parte:

Código: Text
  1.   delete [] miDiccionario.esp;
  2.   delete [] miDiccionario.ing;
  3.  

el primer delete borra el contenido en memoria de la memoria, pero el segundo no y si quito el primero y dejo el segundo, este ultimo borra el contenido de la memoria. ¿a que se debe eso? (creo q esto va ligado con la pregunta de arriba)

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Una Duda Con Delete
« Respuesta #3 en: Lunes 8 de Enero de 2007, 21:57 »
0
Cita de: "Perrero"
Una pregunta ¿xq tienen la misma direccion de memoria? es por

Código: Text
  1. Diccionario[*cont] = miDiccionario;
  2.  

y en esta parte:

Código: Text
  1.   delete [] miDiccionario.esp;
  2.   delete [] miDiccionario.ing;
  3.  

el primer delete borra el contenido en memoria de la memoria, pero el segundo no y si quito el primero y dejo el segundo, este ultimo borra el contenido de la memoria. ¿a que se debe eso? (creo q esto va ligado con la pregunta de arriba)
No hay ninguna razon como para que no la tengan, solo existe en un lugar la memoria donde estan esas cadenas, para que tuviera otra direccion tendrias que reservar memoria y copiar esas cadenas ...

No se muy bien a que te referis. ¿esp e ing son char *, verdad?

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Perrero

  • Miembro MUY activo
  • ***
  • Mensajes: 209
    • Ver Perfil
Re: Una Duda Con Delete
« Respuesta #4 en: Lunes 8 de Enero de 2007, 23:00 »
0
esp y ing si son char.

mmmmm yo pense que necesariamente tenian que tener direcciones de memoria diferentes y q eso ya se asignaba automaticamente

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Una Duda Con Delete
« Respuesta #5 en: Lunes 8 de Enero de 2007, 23:15 »
0
Cita de: "Perrero"
esp y ing si son char.

mmmmm yo pense que necesariamente tenian que tener direcciones de memoria diferentes y q eso ya se asignaba automaticamente
Son char *, punteros a char, y no se asigna automaticamente nada. Ambas variable en x86 ocupan 4 BYTES unicamente y lo que hacen es tener como valor una direccion de memoria en esta caso la donde esta/ba la cadena que hayas obtenido por teclado y que sera la direccion devuelta por new. Si te das cuenta esa direccion seguramente es repetida todas las veces que entra a esa funcion ya que como haces delete se recicla.

Para que se haga "automaticamente" podes usar string en vez de char * en la estructura. Y despues no instanciar una variable de la estructura sino dos variable char *.

Algo asi (es para que te guies):
Código: Text
  1.  
  2.   char *esp = new char[50];
  3.   char *ing = new char[50];
  4.  
  5.   printf("\nIngrese la palabra en espanol: ");
  6.   gets(esp);
  7.   printf("Ingrese la palabra en ingles: ");
  8.   gets(ing);
  9.  
  10.   //primero usamos 0 como indice
  11.   Diccionario[*cont].esp = esp;
  12.   Diccionario[*cont].ing = ing;
  13.   (*cont)++;
  14.   delete [] esp;
  15.   delete [] ing;
  16.  
  17.  

Y para cuando quieras imprimir los resultados usa esp.c_str(); que te devuelve el char * necesario.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.