Estás en: Inicio >> Foros >> Informática >> Programación
Programación /

[C++] [c++] Destructores confusión

Participa en el tema [C++] [c++] Destructores confusión en el foro Programación.
//Supongamos que tengo definidas estas clases class uno {int x; public: uno(void) {} uno(int i) ...

Buscar en este tema:
 
  •  
    _e_ escribió el 16/10/2004 a las 10:09 hs.
     
    ¿Mensaje inapropiado?
    #1 [C++] [c++] Destructores confusión
    //Supongamos que tengo definidas estas clases


    class uno
    {int x;
    public:
    uno(void) {}
    uno(int i) {x=i;}
    ~uno(void) {x=0;}
    void setx(int i) {x=i;}
    int getx(void) {return x;}
    };

    class dos
    {int x;
    public:
    void setx(int i) {x=i;}
    int getx(void) {return x;}
    };

    #include<stdio.h>
    void main (void)
    { uno W (1);
    dos X;
    X.setx(5);
    dos Y[10];
    dos Z[10];
    uno *V=new uno[10];
    dos *B=new dos[10];

    printf("%d",X.getx());

    // W??
    delete Y;
    delete Z;
    delete V;
    delete B;
    }

    /*
    Pregunta 1 :

    Como destruyo W???
    Como destruyo X???
    Pregunto porque a veces quiero dejar de usar un objeto y crear otro
    y me queda siempre en memoria, no me trae problemas, pero me
    molesta que vayan quedando en memoria...


    Pregunta 2 :

    Mas allá de si es estatico o dinamico
    ¿esta bien usar delete cuando uso new y cuando no uso new ?
    ¿en que caso se libera el espacio ocupado por los objetos?

    Cualquier dato será de utilidad..
    Muchas Gracias


    */
    +
     
    0
    Me gusta
     
    http://www.psicofxp.com/forums/programacion.313/210432-c-c-destructores-confusion.html
    | Más
  • Kremar escribió el 16/10/2004 a las 15:27 hs. ¿Mensaje inapropiado?

    #2 Re: [c++] Destructores confusión

    aver... tu delete Y y Z esta mal... delete SOLO lo podes usar para liberar cosas que pediste con new... NADA MAS... el resto de las cosas se van a destruir solas cuando se muera su scope (cuando la ejecucion llegue al } que corresponde al ultimo { antes de declararlas), como con cualquier otra variable... obvio q si les pones "static", tonces no se destruyen nunca...hacer delete a algo q no pediste es practicamente pedirle a "dios" que te segfaultee el programa...

    K
    Me gusta este mensaje
  • MaTT escribió el 16/10/2004 a las 15:40 hs. ¿Mensaje inapropiado?

    #3 Re: [c++] Destructores confusión

    bue..., aca va mi opinion:
    - a W como su clase tiene destructor q no destruye no lo vas a poder destruir asi como esta, sino q vas a tener q crearlo con la sentencia new al lado y despues lo destruis con el delete, al X lo destruis con X.~dos(), esta funcion (destructor) se crea por defecto en tu clase sin q la declares y deberia destruir tu objeto, pero..., en ciertos compiladores, esto no es tan asi, por lo q recomiendo siempre usar el new y el delete si queres liberar memoria.
    - en el caso de la pregunta 2, para q el delete tenga efecto tenes q haber declarado la variable (por mas q sea objeto) con el new, y algunos compiladores te van a tirar error si pones el delete a una variable q no es "dinamica" por asi decirlocomo hiciste ahi con Y y Z.
    Lo q dicen mas arriba es correcto "en teoria", puede q esto no funcione y me ha pasado, por lo q por las dudas siempre uso new & delete

    salu2
    hi matt
    Me gusta este mensaje
  • Shandrio escribió el 16/10/2004 a las 15:48 hs. ¿Mensaje inapropiado?

    #4 Re: [c++] Destructores confusión

    Hola _e_!

    Bueno, aquí la gente ya te respondió a tus preguntas en particular. Yo quería agregar algunas otras cosillas

    1) W se destruye solo, cuando termina tu función main()
    X también. La idea de crear un objeto en el stack (memoria estática) es justamente que no te tengas que preocupar de reservar y liberar memoria. La memoria dinámica la utilizas generalmente cuando no sabes el tamaño que va a tener un objeto de antemano o cuando ocupa mucha memoria. No debería preocuparte que quede en memoria, solo va a sobrevivir el ambiente de la función en la cual fue declarado (el scope como dijo k). Si tu programa está bien modularizado y cada módulo (sea función o método) solo instancia los objetos que va a usar y nada más, liberar su memoria no es algo imperativo, podes dejarlo que lo haga solo al hacer variables estáticas.

    Una aclaración: No confundas destruir con liberar memoria, aunque se puedan hacer las dos "cosas" juntas no es lo mismo!

    Destructor: ~NombreDeClase() {}
    Liberar memoria en C++: delete puntero; En C: free(puntero);

    2) Esto también te lo contestaron y lo aclaro: delete se usa para liberar memoria que se reservó usando new y SOLO para liberar memoria que se reservó con new. NO uses delete si no usarte new.

    Otro error grave: cuando usas el operador new [] (por ejemplo en dos *B=new dos[10]) debes usar el operador delete []

    Ejemplo:
    Código:
    char* cadena= new char[255];
     
    strcpy(cadena, "Hola!");
    printf(cadena);
     
    delete [] cadena;
    
    Bueno, espero haber aclarado mejor las cosas y no simplemente haber repetido lo que ya te contestaron K y hi_matt...

    Salu2!
    Shandrio
    Me gusta este mensaje
  • _e_ escribió el 16/10/2004 a las 23:57 hs. ¿Mensaje inapropiado?

    #5 Re: [c++] Destructores confusión

    Gracias a Todos por las respuestas!
    Ya estoy destruyendo objetos a dos manos...!

    (por lo leido, ahora no me preocupa tanto destruirlos)

    Originalmente publicado por Shandrio

    Otro error grave: cuando usas el operador new [] (por ejemplo en dos *B=new dos[10]) debes usar el operador delete []

    Ejemplo:
    Código:
    char* cadena= new char[255];
     
    strcpy(cadena, "Hola!");
    printf(cadena);
     
    delete [] cadena;
    

    Lo que más me sorpende es esto, porque la verdad pensé que eran equivalentes
    delete (x) y delete [] x.....



    Ahora, el viejo delete(x), ¿cuando se usa?
    Me gusta este mensaje
  • Shandrio escribió el 17/10/2004 a las 12:41 hs. ¿Mensaje inapropiado?

    #6 Re: [c++] Destructores confusión

    Usas delete x cuando usaste new x. Por ejemplo:
    Código:
    MiClase objeto = new MiClase(parametro);
     
    objeto.metodo(param);
     
    delete objeto;
    
    y usas delete [] cuando usaste new[], como en el ejemplo del string que escribí en el mensaje anterior y vos citaste.

    Se entendió?

    Salu2,
    Shandrio
    Me gusta este mensaje
  • _e_ escribió el 18/10/2004 a las 07:55 hs. ¿Mensaje inapropiado?

    #7 Re: [c++] Destructores confusión

    Clarissimo, Gracias
    Me gusta este mensaje
Estás en: Inicio >> Foros >> Informática >> Programación


Estadísticas del tema
  • 6 RESPUESTAS
  • 4177 VISTAS
  • 4 USUARIOS RESPONDIERON
 
Ir arriba
Contacto | Acerca de | Ayuda | Términos Legales | privacidad | Pautas de convivencia | Mapa de los foros | TrabajÁ con nosotros
©2008 Psicofxp.com S.A. - Todos los derechos reservados
Certifica IAB