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:
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).
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
}
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.
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;