2 votes

Comment déclarer un membre pointeur pour interdire sa suppression ?

Je veux garantir que le pointeur que j'ai passé à la fonction ne peut pas être supprimé à l'intérieur de cette fonction (je veux dire que le compilateur générerait une erreur lors du traitement d'une telle fonction). Voici la situation initiale.

void foo(Bar *bar) { delete bar; }

J'ai alors essayé en vain quelques solutions.

void foo(Bar *bar) { delete bar; }
void foo(const Bar * const bar) { delete bar; } { delete bar; }
template <typename T> void foo(const T &t) { delete t; } // calling foo(bar);

Je voudrais savoir s'il existe un moyen d'interdire la suppression d'un pointeur. Et si ce n'est pas possible, pourquoi a-t-il été créé ?

1voto

Jan Herrmann Points 1643

Ce n'est pas possible. Vous pouvez essayer de tout supprimer. Le compilateur ne peut pas se plaindre, mais au moment de l'exécution, vous pouvez obtenir un comportement indéfini. Regardez le code suivant :

int const i=4;
int const* pi = &i;
delete pi;

qui se compile mais produit un erreur d'exécution . Comme vous pouvez le constater, il est même possible de supprimer un pointeur sur un fichier constante situé sur la pile. La norme le permet (Herb Sutter en a parlé, mais je n'ai pas trouvé de lien), car les destructeurs doivent nettoyer les objets const (RAII) lorsqu'ils quittent un champ d'application. Dans tous les cas, une fonction est capable d'obtenir l'adresse d'un paramètre et d'appeler delete sur celui-ci. Même si vous travaillez avec un destructeur privé et des fonctions amies qui sont capables de détruire ces objets, vous ne pouvez pas empêcher ces fonctions d'être appelées. Je pense que votre seul choix est de faire confiance à la fonction appelée.

0voto

Zac Howland Points 12204

1) Si vous déclarez la fonction, vous empêchez la suppression du pointeur en ne le supprimant pas.

2) Si vous souhaitez que la fonction ne supprime pas l'objet, passez l'objet par référence plutôt que par pointeur : void foo(Bar& bar);

3) Si vous voulez vraiment des points bonus, utilisez une classe de pointeurs intelligents au lieu de pointeurs bruts (par ex. shared_ptr , unique_ptr etc.)

Corollaire à 3) Si vous ne voulez pas que quelqu'un d'autre supprime l'objet (c'est-à-dire que vous voulez qu'un objet usine se charge de la gestion de la mémoire), créez le destructeur en tant que privé et toutes les fonctions qui appellent delete sur l'objet provoquerait une erreur de compilation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X