124 votes

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

Duplicata possible :
Quand dois-je utiliser le mot-clé new en C++ ?

Quand dois-je utiliser l'opérateur "new" en C++ ? Je viens d'un environnement C#/Java et l'instanciation d'objets est déroutante 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);

o

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

Quelqu'un peut-il me préciser quand utiliser le nouvel opérateur et quand ne pas le faire ?

Duplicata de :

Quand dois-je utiliser le mot-clé new en C++ ?

En rapport :

À propos des constructeurs/destructeurs et des opérateurs new/delete en C++ pour les objets personnalisés

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

170voto

Andrew Grant Points 35305

Vous devez utiliser new lorsque vous souhaitez qu'un objet continue d'exister jusqu'à ce que vous delete ça. Si vous n'utilisez pas new alors l'objet sera détruit lorsqu'il sortira du champ d'application. Voici quelques exemples :

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écide si votre objet se trouve sur le tas ou 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 celui où l'objet qui le contient, Foo, est alloué. Je préfère appeler cela une allocation "in-place".

class Foo
{

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

L'allocation (et la libération) d'objets à l'aide de la fonction new est beaucoup plus coûteux que s'ils sont alloués sur place. Son utilisation doit donc être limitée aux cas où cela est nécessaire.

Un deuxième exemple de quand allouer via new est pour les tableaux. Vous ne pouvez pas* changer la taille d'un tableau in-place ou d'un tableau de pile au moment de l'exécution, donc lorsque vous avez besoin d'un tableau de taille indéterminée, il doit être alloué via new.

Par exemple

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

(*pointilleux préventif - oui, il existe des extensions qui permettent des allocations de pile de taille variable).

10voto

Eclipse Points 27662

Jetez un coup d'œil à cette question y cette question pour de bonnes réponses sur l'instanciation des objets C++.

L'idée de base est que les objets instanciés sur le tas (à l'aide de new) doivent être nettoyés manuellement, ceux instanciés sur la pile (sans new) sont automatiquement nettoyés lorsqu'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
}

4voto

Sarah Jamie Lewis Points 3244

Vous devriez utiliser new lorsque vous voulez qu'un objet soit créé sur le tas au lieu de la pile. Cela permet d'accéder à un objet depuis l'extérieur de la fonction ou de la procédure en cours, à l'aide de pointeurs.

Il pourrait vous être utile d'étudier les pointeurs et la gestion de la mémoire en C++, car il s'agit d'éléments que vous n'avez probablement pas rencontrés dans d'autres langages.

2voto

Lomilar Points 321

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

En choisissant la première option, cette mémoire sera automatiquement libérée lorsque la portée sera 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;

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