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).