Double Possible:
Quelle est la différence entre l'instanciation d'un objet à l'aide de nouveaux vs sansC'est probablement une question de base, et peut-être déjà été demandé (par exemple, ici); mais je ne comprends toujours pas. Alors, permettez-moi de demander.
Considérez les points suivants de la classe C++:
class Obj{ char* str; public: Obj(char* s){ str = s; cout << str; } ~Obj(){ cout << "Done!\n"; delete str; // See the comment of "Loki Astari" below on why this line of code is bad practice } };
quelle est la différence entre les extraits de code suivants:
Obj o1 ("Hi\n");
et
Obj* o2 = new Obj("Hi\n");
Pourquoi l'ancien appelle le destructeur, mais ce dernier n'a pas (sans appel explicite à l'
destroy
)?Qui est préférée?
Réponses
Trop de publicités?Les deux font des choses différentes.
La première crée un objet avec automatique de la durée de stockage. Il est créé, utilisé, et puis s'en va hors de portée lorsque le bloc courant ({ ... }
) se termine. C'est le moyen le plus simple pour créer un objet, et est le même que lorsque vous écrivez int x = 0;
La seconde crée un objet avec dynamique de la durée de stockage et permet deux choses:
Un contrôle plus fin de la durée de vie de l'objet, puisqu'il ne va pas hors de portée automatique: vous devez détruire explicitement en utilisant le mot-clé
delete
;Création de tableaux avec une taille connue qu'à l'exécution, depuis la création de l'objet se produit lors de l'exécution. (Je ne rentrerai pas dans les détails de l'allocation dynamique de tableaux ici.)
Ni est préféré; il dépend de ce que vous faites, lequel est le plus approprié.
L'utilisation de l'ancienne, sauf si vous devez utiliser celui-ci.
Votre C++ livre devrait couvrir ce assez bien. Si vous n'en avez pas, n'allez pas plus loin jusqu'à ce que vous avez acheté et lu, à plusieurs reprises, l'un de ces.
Bonne chance.
Votre code d'origine est cassé, comme c' delete
s - char
tableau qu'il n'avait pas new
. En fait, rien n' new
d de la C-chaîne de style; il est venu à partir d'une chaîne littérale. delete
ing qui est une erreur (bien qu'il ne générera pas d'erreur de compilation, mais plutôt un comportement imprévisible au moment de l'exécution).
Souvent un objet ne doit pas avoir la responsabilité de l' delete
ing quelque chose qu'il n'a pas lui-même new
. Ce comportement doit être bien documenté. Dans ce cas, la règle est complètement brisé.
Le premier alloue un objet avec une durée de stockage automatique, ce qui signifie qu'il sera automatiquement détruit à la sortie de la portée dans laquelle il est défini.
La seconde a alloué un objet avec une durée de stockage dynamique, ce qui signifie qu'il ne sera pas détruit avant que vous n'utilisiez explicitement delete
pour le faire.