Il existe de nombreuses questions à discuter des détails de C et C ++ avec la suppression du pointeur-to-Cons, à savoir que Ce qui m'intéresse est de savoir si vous pensez que c'est une bonne pratique de le faire, pas ce que les langues (C et C ++) permettent. p>
Arguments de suppression du pointeur à Const incluent: P>
Arguments contre celui-ci incluent: P>
S'il vous plaît, argument bien dans vos réponses et peut-être référence aux autorités. Mon intention n'est pas de commencer un sondage ici. P> gratuit () code> ne les accepte pas et que
supprime code> et
Supprimer [] CODE> DO et cette Constance n'empêche pas la destruction de l'objet. P>
kfree () code>, contrairitable
gratuit () code>, prend un argument
void const * code> car il pense que libérer la mémoire n'affecte pas ce qui est pointé vers. li>
gratuit () code> a été conçu avant l'introduction du mot clé Const. LI>
4 Réponses :
Je n'ai jamais vraiment compris les arguments contre la suppression (ou la liberté) d'un pointeur Const. Plus précisément, je vois quelque peu le rationnel mais il me semble qu'ils s'appliquent également bien à un membre de Const dans un objet ou une variable de const dans un Bloc, et je n'ai jamais vu personne qui ne fait pas valoir que ceux qui ne devraient pas être détruits et leur mémoire Libéré lorsque l'objet contenant est supprimé ou que l'exécution quitte leur bloc contenant.
Les deux numéros de gestion de l'utabilité logique des objets (c.-à-d. Constons ou non) et gérer leur longueur de vie (c.-à-d. Utiliser une variable d'objet, un pointeur intelligent - - Quel et un pointeur brut ou un pointeur brut) ne semble pas lié à moi. p>
en d'autres termes, si p> est valide et bon style. Pourquoi P> {
Foo const* xptr = new Foo;
...
delete xptr;
}
@Poita_, IMHO Le problème de la propriété et le problème de mutabilité logique sont indépendants. Je ne vois pas pourquoi je devrais garder un pointeur à un objet immuable juste parce que je veux pouvoir détruire l'objet plus tard. Pour pouvoir détruire l'objet, vous devez être propriétaire, mais cela n'implique pas que vous devez être capable de le modifier. Bien qu'il soit douteux d'avoir la totalité des entités du propriétaire ne pouvant pas modifier l'objet lorsqu'une entité non propriétaire est, avoir un objet que personne ne peut modifier tant qu'il est détruit a de sens comme ayant deux types de propriétaires, il est capable de modifier , on pas.
Je suis d'accord, mais je crois que c'était la question qui était posée.
@Poita_: "C'est un problème de propriété", pas une question de la Centé. Si FOO prend la propriété de XPTR, alors foo est responsable de le déroulant.
Eh bien, voici quelques éléments pertinents éventuellement trop longtemps pour vous intégrer à un commentaire: P>
Il y a quelque temps la pratique de libérer la mémoire via un pointeur à const était interdit plaine, voir ce dr. L'article de Dobb, la "loi sur la langue" (:)) partie i> . P> li>
Il existe deux fois une discussion pertinente sur http: // Groupes.google.ru/group/comp.lang.c++.Modé a : " Supprimer un moteur de const? " I> , mon propre point (puisque vous demandez des arguments): Possibilité de l'opération en question dans un contexte donné est défini par le contrat (explicitement ou implicitement défini dans le document) d'une classe ou d'une fonction, non par seulement la signature de méthode ou de types de paramètres. p> li>
ol>
C'est une bonne pratique d'utiliser la stratégie appropriée pour mettre fin à la durée de vie d'un objet. Pour des objets dynamiques, cela signifie que vous supprimez ce que vous NOUVEAU, libres ce que vous malloc, etc. Si cet objet est constitué ou non n'a aucune incidence sur si sa vie devrait se terminer.
Être constant ou volatile sont des propriétés qui existent dans la durée de vie d'un objet, et qui se termine par une expression de suppression ou un appel à la libération. Indépendamment de vos propres vues sur la question ou de la manière dont les choses fonctionnent dans d'autres langues, c'est ainsi que le modèle d'objet de C ++ fonctionne. Un exemple simple pour montrer c'est la manière dont la langue traduit les expressions de suppression des appels de suppression de l'opérateur: p> Un autre exemple, mais peut-être moins clair, c'est pourquoi vous ne pouvez pas surcharger des ctors sur le const : p> Un objet est uniquement Const après sa création (la vie de sa durée de vie commence; arrive lorsque le CTor revient normalement) et avant qu'il ne soit détruit (aka ses extrémités de vie; arrive comme le DTOR est entré). Avant ou après cette durée de vie, vous pouvez avoir un pointeur de type le même La ligne de raisonnement s'applique à C, sauf que vous devez considérer que c a atteint environ 40 ans d'histoire et a réussi à maintenir une grande quantité de cohérence pendant une grande partie de cette période. P> (Je crois que cette question est subjective et argumentatif em> et voterait pour le fermer de cette façon, sauf que j'ai apparemment aidé Spark la discussion; donc répondant comme cw.) p> p> t const * code> (par exemple), mais cela ne pointe pas d'un objet et d'une déséroférance, il est UB. P>
Constance et vie sont deux choses différentes. Je ne vois aucun problème libérant un objet Const si le propriétaire de cet objet décide que l'objet n'a aucune raison de vivre (de la même manière qu'un objet en ce qui concerne const code> est un objet local obtiendra «distribué» quand il est hors de portée ). p>
gratuit () code> ne pas prendre un
Const de pointeur code> Const, je pense que l'on pourrait faire valoir que cela pourrait avoir été une surveillance du comité des normes ou que c'est Parce qu'il faut le même type si le pointeur que
malloc () code> retourne. p>
Pour moi, accepter un non-const i> signifie un paramètre Out. Je serais également surpris si au lieu de mettre à jour l'objet, il est détruit à la place.
@nobugz ne sont pas de nombreuses précieuses «meilleures pratiques» (d'une manière) subjective, depuis la réponse (s'il y en a une) dépend fortement de la distribution statistique des pratiques / préférences (etc.)?
@Svisitor, transférer la propriété par le paramètre de pointeur non Const est assez commun. Tous les pointeurs intelligents le font dans leurs constructeurs et leurs fonctions de réinitialisation possibles, et assez souvent, il est également constaté directement dans les applications (généralement comme des arguments des constructeurs - qui est souvent une fuite de mémoire potentielle au fureur, mais c'est un problème pour une autre question).
@MLVLJR: Vous posez une question subjective, puis une question subjective qui promeut l'argument. Peut-être avez-vous oublié la réponse (maintenant supprimée) qui a été réduite à des accusations annonces d'hominem dans l'espace de 4 commentaires --- C'est assez argumentatif.
IMO, une fonction qui supprime les pointeurs doit avoir un nom qui le dit: Deletex, horothx, Freex, relâche. Si l'argument est constitué ou non ne semble pas entrer dans la photo du moins. Si le nom de la fonction ne le dit pas, je n'ai aucune raison de s'attendre à ce que
void foobar (x *) code> assumerait la propriété et libérerait l'objet. - En ce qui concerne les pointeurs intelligents: ne serait-il pas difficile d'avoir un pointeur intelligent à un objet mutable s'il accepte uniquement les indicateurs de Conscons?
@Svisitor, vous manquez au cas plutôt courant de transmettre la propriété à une classe, souvent via constructeur. Dans ce cas, la fonction ne devrait évidemment pas être nommée Supprimer / détruire / GRATUITEMENT, et il peut être difficile d'impliquer le transfert de propriété par la fonction de fonction / de classe de classe.