2010-03-02 5 views
17

Si tengo la siguiente declaración:¿Debo eliminar los miembros de cadena de una clase de C++?

#include <iostream> 
#include <string> 

class DEMData 
{ 
private: 
    int bitFldPos; 
    int bytFldPos; 
    std::string byteOrder; 
    std::string desS; 
    std::string engUnit; 
    std::string oTag; 
    std::string valType; 
    int idx; 
public: 
    DEMData(); 
    DEMData(const DEMData &d); 
    void SetIndex(int idx); 
    int GetIndex() const; 
    void SetValType(const char* valType); 
    const char* GetValType() const; 
    void SetOTag(const char* oTag); 
    const char* GetOTag() const; 
    void SetEngUnit(const char* engUnit); 
    const char* GetEngUnit() const; 
    void SetDesS(const char* desS); 
    const char* GetDesS() const; 
    void SetByteOrder(const char* byteOrder); 
    const char* GetByteOrder() const; 
    void SetBytFldPos(int bytFldPos); 
    int GetBytFldPos() const; 
    void SetBitFldPos(int bitFldPos); 
    int GetBitFldPos() const; 
    friend std::ostream &operator<<(std::ostream &stream, DEMData d); 
    bool operator==(const DEMData &d) const; 
    ~DEMData(); 
}; 

qué código debe haber en el destructor? ¿Debo "eliminar" los campos std::string?

+2

Un comentario sobre el estilo: en lugar de devolver 'const char *' de las funciones, prefiero devolver 'const std :: string &'. Esto es posible cuando la cadena devuelta es un miembro del objeto. Y de manera similar para la entrada, preferiría 'const std :: string &' –

+2

¿Te molestaste en probar esto antes de publicar la pregunta? No podría eliminar esas cadenas, incluso si quisiera. –

+1

A veces se puede ver a personas que llaman 'clear()' en contenedores estándar antes de que salgan del alcance ("eliminar" en este sentido). Eso tampoco será necesario. – UncleBens

Respuesta

24

Su destructor solo tiene que destruir los miembros para los que asigna recursos. entonces no, no "borras" cadenas.

Se elimina punteros que destinar con nueva

Su destructor no tiene que ser algo más que

~DEMData() 
{ 
} 
+10

, de hecho, puede dejar ese destructor. el compilador lo hará por usted – pm100

+2

Y el compilador generará eso para usted si no lo proporciona. – Torlack

6

No, los miembros de std :: string se asignan automáticamente en la pila o el montón para usted y se limpian automáticamente. No tiene que hacer nada especial en su destructor para manejar las cadenas.

+1

En la pila? Solo si la instancia 'DEMData' está en la pila. –

+1

Estrictamente hablando, no se puede decir si el objeto std :: string está en la pila o en el montón porque no se sabe cómo se está construyendo DEMData. La cadena contenida estará en el montón a menos que la implementación de std :: string use el objeto std :: string en sí mismo para almacenar la cadena para cadenas cortas. – Torlack

3

No es necesario un destructor (ni un constructor de copia, ni un operador de asignación sobrecargado). Ese es el punto de utilizar una clase como cadena que hace las cosas por usted, en lugar de ir con cadenas de estilo C y la gestión de memoria manual.

El compilador produce todo lo mencionado anteriormente para usted y, de forma predeterminada, el destructor invoca los destructores de todos los miembros (esto sucede implícitamente incluso después de que se complete un destructor definido por el usuario). El destructor de String toma el control desde allí.

+0

Creo que esta debería ser la respuesta aceptada ya que responde a la "cosa" que molestaba al OP: > por defecto el destructor solo invoca los destructores de todos los miembros (esto sucede implícitamente incluso después de que un destructor definido por el usuario se complete). – Opher

5

No, no debe eliminar los objetos std::string. serán liberados automáticamente cuando se llame a su destructor.

Cuestiones relacionadas