Pointeur C++ et de référence avec un nouveau mot-clé lors de l'instanciation
Quand je veux instancier une classe en C++ j'ai l'habitude d'aller de cette façon
Book bk = new Book();
Mon professeur a fait récemment cette
Book &bk = *new Book();
Il m'a seulement dit qu'il allait utiliser une référence pour être en mesure d'utiliser le point (par exemple, bk.getTitle();) opérateur au lieu de la flèche (par exemple bk->getTitle();). Je comprends cette partie du code, mais ce qui se passe lorsque vous utilisez l'opérateur * en combinaison avec de nouveaux?
Merci d'avance
l'exemple complet de code peut être trouvé ici c'est le arraystack dans la fonction principale
Si votre professeur vous a montré comment une fuite de mémoire, la grande.
Si votre professeur utilise ce code pour autre chose que comme un exemple de quelque chose que vous vraiment, vraiment ne pas faire, alors vous devriez trouver un nouveau professeur.
Probablement votre professeur a dit,
La syntaxe de la question est valide, c'est la sémantique qui est très mauvaise.
Vous pourriez faire
Si votre professeur utilise ce code pour autre chose que comme un exemple de quelque chose que vous vraiment, vraiment ne pas faire, alors vous devriez trouver un nouveau professeur.
Probablement votre professeur a dit,
const Book &bk = Book();
. Si ce n'est pas le cas, honnêtement, je ne comprends pas ce que votre professeur voulait dire.La syntaxe de la question est valide, c'est la sémantique qui est très mauvaise.
Vous pourriez faire
delete &bk
, mais c'est toujours un non-sens. @OP de Trouver un nouveau professeur.OriginalL'auteur tim | 2012-02-15
Vous devez vous connecter pour publier un commentaire.
Ce:
est à peu près équivalent à ceci:
Mais il y a une différence cruciale; dans le code d'origine, vous n'avez pas un pointeur que vous pouvez utiliser pour
delete
la allouée dynamiquement un objet lorsque vous avez terminé avec elle, de sorte que vous avez effectivement créé une fuite de mémoire.Bien sûr, vous pourriez faire ceci:
mais c'est extrêmement non-idiomatiques C++, et très susceptible de causer des problèmes plus tard.
En résumé, il n'y a absolument aucune bonne raison d'écrire ce code, ainsi ne pas le faire. L'une des conditions suivantes est fine:
Vous avez certainement pas créé une fuite de mémoire si, je pense que c'est une énorme exagération
Le code d'origine n'ont, en effet, une fuite... Que voulez-vous dire?
C'est pourquoi j'ai dit "effectivement". Mais le besoin d'écrire des choses comme des insanités comme
delete &bk
mène à toutes sortes de questions sémantiques, qui à son tour conduire à oublier de nettoyer quelque chose quelque part en bas de la ligne.OriginalL'auteur Oliver Charlesworth
J'ai trouvé une situation qui permettez-moi de penser que la syntaxe. Envisager un pointeur intelligent pour un
Base
classe et qui doit contenir un pointeur vers une classe dérivée et vous souhaitez accéder à certains non-virtuel choses de la classe dérivée après la construction. Dans ce cas, quelque chose comme ce qui est légal et ne peut pas être si mauvais:Enfin, j'ai toujours préféré les petites flèches à l'étrange arobases:
Mais je pense que dans ce cas c'est juste une question de goût, surtout si vous accéder à un certain nombre de méthodes.
D'autres choses qui conduisent soit à des fuites ou à
delete &d;
sont tout simplement mauvais, mauvais, mauvais.OriginalL'auteur DarioP