Quelle est la différence entre l'instanciation d'un objet à l'aide de nouveaux vs sans
En C++,
Côté d'allocation dynamique de la mémoire, est-il une différence fonctionnelle entre les deux lignes de code suivantes:
Time t (12, 0, 0); //t is a Time object
Time* t = new Time(12, 0, 0);//t is a pointer to a dynamically allocated Time object
Je suis en supposant bien sûr qu'un Temps(int, int, int) ctor a été défini. Je me rends compte aussi que dans le second cas t devra être supprimé car il a été alloué sur le tas. Est-il d'autres différences?
- Il ne compte pas vraiment comme une réponse, mais à part les réponses déjà données, vous pourriez être intéressés de savoir que vous pouvez remplacer l'opérateur new/delete si vous souhaitez écrire votre propre gestion de la mémoire (pour de meilleures performances).
Vous devez vous connecter pour publier un commentaire.
La ligne:
... alloue une variable de type
Time
dans une portée locale, généralement sur la pile, qui sera détruit lors de son champ d'application se termine.Par contraste:
... alloue un bloc de mémoire en appelant soit
::operator new()
ouTime::operator new()
, et par la suite des appelsTime::Time()
avecthis
définir une adresse à l'intérieur de ce bloc de mémoire (et aussi retourné à la suite d'new
), qui est ensuite stocké danst
. Comme vous le savez, c'est généralement fait sur le tas (par défaut) et nécessite que vousdelete
plus tard dans le programme, alors que le pointeur danst
est généralement stockées sur la pile.Time
objet.Time t (12, 0, 0);
créé sur la pile? J'étais en train de question et il y avait une discussion dans les commentaires (here, here et le reste du fil de commentaires), mais je ne comprends pas ce qu'il veut dire. Pourriez-vous clarifier cela.Time t
est créé "généralement sur la pile" automatique de la durée de stockage, alors quenew Time()
a dynamique de la durée de stockage et "en général [stocke] sur le tas." "Automatique" en ce sens, la "contrôlée par le champ d'application" et "dynamique" signifie "contrôlée parnew
/delete
."Encore une différence évidente est lors de l'accès aux variables et aux méthodes de t.
Autant que le constructeur, les deux formes sont identiques: ils vont juste cause le constructeur pour être appelé sur un nouvellement allouée instance de l'objet. Vous semblent déjà avoir une bonne connaissance sur les différences en termes de répartition des modes d'objet et de la durée de vie.
Je pense que vous comprenez déjà toutes les différences. En supposant que vous êtes bien conscients de la syntaxe de la différence de l'accès à un membre de t par l'intermédiaire d'un pointeur et d'une variable (bien, pointeur est également une variable, mais je pense que vous comprenez ce que je veux dire). Et en supposant également que vous savez la différence de l'appel par valeur et appel par la référence lors du passage de t à une fonction. Et je pense que vous comprenez aussi ce qui va se passer si vous affectez t à une autre variable et de faire le changement à travers d'autres variables. Le résultat sera différent selon que t est pointeur ou pas.
Il n'y a pas de différence fonctionnelle de l'objet entre l'allocation sur la pile et de l'allocation sur le tas. Les deux invoquer le constructeur de l'objet.
D'ailleurs je vous recommande d'utiliser l'amplification du shared_ptr ou scoped_ptr qui est également fonctionnellement équivalent lors de l'allocation sur le tas (avec l'utilité supplémentaire de scoped_ptr limitant la copie non-copiable pointeurs):
Pas de.. Il n'y a pas d'autre différence..
Il n'y a pas d'autre différence à ce que vous savez déjà.
En supposant que votre code est d'utiliser le service par défaut de l'opérateur new.
Opérateur d'appel de la nouvelle fonction de gestion dynamique de la mémoire, puis d'appeler la constuctor fonction.
Ne opérateur d'appel d'une fonction nouvelle, vient directement à l'appel de la constuctor fonction. La pile sera utilisé directement, sans l'utilisation de malloc.