2016-10-17 3 views
2

Salut dans une classe cpp X J'ai unstd :: map <struct, int> Ai-je besoin de destructeur?

class X{ 
    private: 
     std::map<some_struct, int> C; 
} 

Où some_struct est défini comme:

typedef struct{ 
    int a; 
    int b; 
    int c; 
}some_struct; 

Ma question est la suivante: dois-je préciser quoi que ce soit au sujet de la carte C dans le destructor de X? Si oui, que doit faire le destructeur de X pour la carte C?

+0

Faire une fonction de suppression ou efface la fonction qui traverse chaque élément et l'efface/le supprime de la carte et appelle cette fonction dans votre destructeur dans la classe X. –

+3

@OmidCompSCI ne faites pas cela. destructeur de 'std :: map' le fait d'une manière plus efficace –

+4

vous devriez simplement suivre la règle de zéro: http://fr.cppreference.com/w/cpp/language/rule_of_three https://rmf.io/cxx11/rule-of-zero/ –

Répondre

5

Non, vous n'avez pas besoin de spécifier un destructor pour some_struct ou class X

Pour tout type, il est automatiquement généré par le compilateur. Tant qu'il n'y avait rien explicitement alloué à la classe au stockage dynamique avec new ou new [], vous n'avez pas besoin d'écrire un destructeur qui applique une opération delete ou delete[].


également pour le code écrit C++ (vs c) vous n'avez pas besoin d'utiliser cette syntaxe typedef:

struct some_struct { 
    int a; 
    int b; 
    int c; 
}; 
+1

Le destructeur est généré pour tous les types – NathanOliver

+1

Toutes les classes ont un destructeur généré automatiquement –

+0

"Tant qu'il n'y avait rien d'explicitement attribué à la classe ..." La classe référencée est X. Si some_struct alloue de la mémoire, qui devrait être libérée dans le destructeur de sone_struct. – Carl

2

Tant que vous ne présentez pas new les opérateurs, vous êtes bien à aller avec le destructeur par défaut.

ALL Les conteneurs STL (carte, vecteur, liste, deque, etc ...) n'ont pas besoin de destructeurs spéciaux. Ils sont autonomes et proprement conçus pour se détruire une fois que vous sortez de la portée.

+0

'new' opérateur n'est pas un bon indicateur que vous avez besoin de destructeur ou non. Je peux avoir 'unique_ptr (new some_struct)' et encore enregistrer –

+0

@BryanChen toujours l'affirmation "s'il n'y a pas de nouveau que vous êtes bien avec le destructeur par défaut" détient. Cela n'implique pas l'inverse: si vous avez du nouveau, alors vous avez besoin de plus que le destructeur par défaut, comme le montre votre exemple de compteur – user463035818

+0

@BryanChen vous pouvez le faire mais c'est un bug. Si le constructeur du pointeur intelligent lance alors vous avez fui la mémoire. C'est l'une des raisons pour lesquelles les fonctions make doivent être utilisées – NathanOliver

0

Vous devrez vous soucier de C dans destructor si vous aviez dynamiquement objet alloué sur tas avec opérateur new, par exemple:

class X{ 
    public: 
     X(); 
    private: 
     std::map<some_struct, int> *p_C; 
} 

Et dans la définition:

X::X() { 
    p_C = new map<some_struct, int>(); 
} 

X::~X() { 
    if(p_C) delete p_C; 
} 
+1

non parce que vous utiliseriez des pointeurs intelligents dans ce cas – BeyelerStudios

+0

Qu'est-ce qu'un _heap_ au moyen du C++ normes? –

+1

@ πάνταῥεῖ qui est nitpicking maintenant: P –