web-dev-qa-db-fra.com

Quand utiliser "nouveau" et quand ne pas le faire, en C ++?

Duplicate possible:
Quand devrais-je utiliser le nouveau mot-clé en C++?

Quand devrais-je utiliser le "nouvel" opérateur en C++? Je viens de l'arrière-plan C #/Java et l'instanciation des objets est source de confusion pour moi.

Si j'ai créé une classe simple appelée "Point", lorsque je crée un point, dois-je:

Point p1 = Point(0,0);

ou

Point* p1 = new Point(0, 0);

Quelqu'un peut-il clarifier pour moi quand utiliser le nouvel opérateur et quand ne pas le faire?

Duplicate de:

Quand devrais-je utiliser le nouveau mot-clé en C++?

Connexes:

À propos des constructeurs/destructeurs et des nouveaux opérateurs/opérateurs de suppression en C++ pour les objets personnalisés

tilisation correcte de la pile et du tas en C++?

97
Frankenstein

Vous devez utiliser new lorsque vous souhaitez qu'un objet reste en existence jusqu'à ce que vous le delete. Si vous n'utilisez pas new, l'objet sera détruit lorsqu'il sera hors de portée. Quelques exemples de ceci sont:

void foo()
{
  Point p = Point(0,0);
} // p is now destroyed.

for (...)
{
  Point p = Point(0,0);
} // p is destroyed after each loop

Certaines personnes diront que l'utilisation de new détermine si votre objet est sur le tas ou dans la pile, mais cela n'est vrai que pour les variables déclarées dans les fonctions.

Dans l'exemple ci-dessous, l'emplacement de 'p' sera l'emplacement où son objet conteneur, Foo, est alloué. Je préfère appeler cette allocation "sur place".

class Foo
{

  Point p;
}; // p will be automatically destroyed when foo is.

L'allocation (et la libération) d'objets à l'aide de new est beaucoup plus onéreuse que si ils étaient alloués sur place, son utilisation devrait donc être restreinte au besoin.

Un deuxième exemple d'allocation via new concerne les tableaux. Vous ne pouvez pas * changer la taille d'un tableau en place ou empilé au moment de l'exécution. Vous devez donc allouer un tableau de taille indéterminée via un nouveau.

Par exemple.

void foo(int size)
{
   Point* pointArray = new Point[size];
   ...
   delete [] pointArray;
}

(* nitpicking préemptif - oui, il y a des extensions qui permettent des allocations de pile de taille variable).

131
Andrew Grant

Jetez un oeil à cette question et cette question pour obtenir de bonnes réponses sur l'instanciation d'objets C++.

Cette idée de base est que les objets instanciés sur le tas (en utilisant new) doivent être nettoyés manuellement, ceux instanciés sur la pile (sans nouvelle) sont automatiquement nettoyés quand ils sortent de la portée.

void SomeFunc()
{
    Point p1 = Point(0,0);
} // p1 is automatically freed

void SomeFunc2()
{
    Point *p1 = new Point(0,0);
    delete p1; // p1 is leaked unless it gets deleted
}
8
Eclipse

Vous devez utiliser new lorsque vous souhaitez créer un objet sur le tas plutôt que sur la pile. Cela permet d'accéder à un objet en dehors de la fonction ou de la procédure en cours, à l'aide de pointeurs.

Vous trouverez peut-être utile de rechercher des pointeurs et une gestion de la mémoire en C++, car ce sont des choses que vous ne rencontrerez probablement pas dans d'autres langages.

4
AAA

New est toujours utilisé pour allouer de la mémoire dynamique, qui doit ensuite être libérée.

En faisant la première option, cette mémoire sera libérée automatiquement lorsque la portée est perdue.

Point p1 = Point(0,0); //This is if you want to be safe and don't want to keep the memory outside this function.

Point* p2 = new Point(0, 0); //This must be freed manually. with...
delete p2;
1
Lomilar