2010-05-04 3 views
3

Lequel préférez-vous supprimer des objets? Surtout en QT, mais d'autres pratiques sont également les bienvenues. Ces deux alternatives me paraissent identiques, n'est-ce pas?Suppression d'objet: utiliser parent ou non

  1. Lié à une autre classe et détruit lorsqu'il est détruit.

    SomeClass::SomeClass{ 
    socket_ = new QTcpSocket(this); 
    } 
    

ou

  1. détruire le destructeur de la classe

    SomeClass::SomeClass{ 
    socket_ = new QTcpSocket(); 
    } 
    
    SomeClass::~SomeClass{ 
    delete socket_; 
    } 
    

Répondre

8

Quand à Rome, faites comme les Romains. Si votre framework utilise une méthode (par exemple Qt dépend de la relation parent-enfant), utilisez cette méthode dans votre code.

Bien sûr, ne pas oublier les bonnes pratiques de gestion de la mémoire générale: créer l'objet sur la pile chaque fois qu'il est possible, l'utilisation des pointeurs partagés, etc.

+0

+ 1 cohérence avec le code existant est important. –

3

RAII dit que vous devriez le faire dans le destructor de SomeClass. Selon cette philosophie, l'instance SomeClass possède l'instance QTcpSocket, de sorte que la première devrait gérer entièrement la durée de vie de cette dernière. Bien que les deux approches sont valables, je pense que je préférerais celui qui ne nécessite pas de delete this.

+0

Malheureusement, la plupart des gens ne sont pas si intelligents. Il vaut mieux laisser la suppression des objets aux personnes qui savent ce qu'elles font. Utilisez donc un pointeur intelligent. –

+0

@Martin: Votre déclaration semble plutôt incongrue. Bien sûr, un pointeur intelligent est un outil précieux et utile. Il est également important de savoir d'où vient la sémantique RAII d'un pointeur intelligent. –

+0

Malheureusement, la gestion de la mémoire est plus que la construction et la destruction (RAII). Vous devez inclure la copie et l'attribution ainsi que d'autres choses. Toutes ces choses sont faites par des pointeurs intelligents, il n'est pas sage d'essayer de reproduire leur fonctionnalité dans votre propre classe. Dans le code C++ moderne, je ne m'attendrais pas à voir de suppressions (à moins que vous n'écriviez des pointeurs intelligents, tout devrait être caché dans des pointeurs intelligents ou des conteneurs intelligents) –

0

Pour moi, je pense qu'il vaut mieux choisir la façon court d'écrire du code (1), mais avec les meilleures pratiques à l'esprit, car Qt le fait (détruire les variables définies par l'utilisateur) pour vous.

Questions connexes