2010-02-17 5 views
4

parfois je vois dans divers programmes C++, les objets déclarés et utilisés comme ceci:allocation de pointeur vs déclaration normale

object *obj = new object; 
obj->action(); 
obj->moreAction(); 
//etc... 

Y at-il avantage de le faire, au lieu de faire simplement:

object obj; 
obj.action(); 
obj.moreAction(); 
//etc 

Répondre

5

Oui - vous pouvez stocker le pointeur dans un conteneur ou le renvoyer de la fonction et l'objet ne sera pas détruit lorsque le pointeur sera hors de portée. Les pointeurs sont utilisés

  • pour éviter la copie inutile d'objet,
  • pour faciliter la création d'objets en option,
  • pour la gestion de la vie de l'objet personnalisé,
  • pour créer des structures complexes comme le graphique,
  • pour la combinaisons de ce qui précède.

Cela ne vient pas gratuitement - vous devez détruire l'objet manuellement (delete) lorsque vous ne avez plus besoin et décider quand ce moment vient est pas toujours facile, plus vous pourriez oublier de coder.

1

Fondamentalement, vous ne devez utiliser « nouveau » si vous voulez un objet à vivre au-delà de la durée de vie du champ de la création dans Pour exemple:.

X* g(int i) { /* ... */ return new X(i); } // the X outlives the call of g()

Si vous voulez un objet vivre dans un cadre uniquement, ne pas utiliser « nouveau », mais il suffit de définir une variable:

{ 
    ClassName x; 
    // use x 
} 
0

Il revient à avoir plus de contrôle sur le cycle de vie de l'objet en question (lors de l'utilisation new).

3

La première forme, l'attribution des objets sur le tas, vous donne plein contrôle (et pleine responsabilité ) Temps en direct de l'objet: vous devez supprimer explicitement obj. Dans la deuxième forme, l'objet est détruit automatiquement et irrévocablement lorsque obj est en dehors de la partition (en quittant le bloc de code actuel).

+0

Vous l'avez presque mentionné, mais il peut être utile de souligner que la deuxième image est créée sur la pile. – Patrick

2

Une autre raison que personne n'a mentionnée.
La pile est typiquement 1Mb, donc créer des objets volumineux doit être fait sur le tas (avec du nouveau)

+0

8 Mo sur mon Ubuntu 9.04 vanille (ce qui _prove réellement votre point plutôt que de le contredire) – digitalarbeiter

0

Oui, il y a une bonne raison: vous avez beaucoup plus de chance d'avoir un programme correct en utilisant cette dernière forme. Le problème est que l'ancienne forme (pointeur) est un C ism, en C++ vous devez utiliser un pointeur intelligent pour assurer la destruction correcte de l'objet à la fin de sa vie.

Maintenant, si vous utilisez std::auto_ptr<Object> obj(new Object()); vous avez 3 avantages:

  1. vous gérez maintenant le cycle de vie de façon explicite votre objet (mais ne peut pas l'oublier)
  2. vous pouvez vous stocker un objet dans un récipient avec polymorphisme
  3. vous ne bouchent la pile, et ont donc moins de risque de se heurter à un débordement de pile
0

on peut se demander dans un sens inverse: quand utiliser étrange première option? fondamentalement si vous voulez allouer un gros objet, car si vous n'avez pas besoin de le faire et que vous pouvez le mettre sur la pile, l'option sera beaucoup plus rapide: c'est l'un des principaux avantages de l'utilisation de C++ sur JAVA sur le tas. et ce bénéfice est particulièrement vrai lorsqu'il s'agit de nombreuses, nombreuses allocations de petits objets: les mettre sur la pile pour augmenter la vitesse. il y a des frais généraux de pointeur de déréférencement. vous pouvez trouver here infos sur la bibliothèque de bassin de boost qui nous fournit des outils pour gérer de telles allocations.