c ++ doit supprimer une référence?
dans le code suivant:
class x
{
private:
someRef& m_ref;
public:
x(someRef& someRef):m_ref(someRef)
{
}
dois-je faire:
~x()
{
delete m_ref;
}
qui ne marche pas sans obtenir le pointeur...
fondamentalement, je suis en demandant: Dois-je appeler un destructeur sur un membre de référence?
source d'informationauteur |
Vous devez vous connecter pour publier un commentaire.
Pas. Vous pouvez uniquement supprimer les pointeurs, pas de références, et même alors, vous devez supprimer uniquement les objets qui vous sont alloués à l'aide de la
new
de l'opérateur. Et puis, vous devez être sûr de les supprimer qu'une seule fois. Voici le cas où vous auriez besoin d'utiliserdelete
dans votre destructeur:Mais en général, il est préférable de l'éviter, même ce et de l'utilisation des pointeurs intelligents de la place.
Pas.
Vous avez seulement besoin de
delete
un objet si vous en êtes propriétaire. Si vous étiez passé à une référence, cela signifie que quelqu'un d'autre en est le propriétaire, il est donc inutile et, heureusement, la langue de l'en empêche.Je ne pense pas que l'on en fait à proprement parler jamais supprime même des pointeurs. Ce que vous supprimez sont les objets alloués dynamiquement (ou les tableaux d'objets) que le pointeur est une poignée de. Si l'objet provient d'un appel à nouveau et il est de la responsabilité de cette classe pour nettoyer après cet objet, puis vous appelez supprimer.
Il est techniquement possible qu'une référence peut-être référence à un objet alloué dynamiquement:
Cependant, ce serait incroyablement mauvais style. Par convention, le "propriétaire" de la poignée d'un allouée dynamiquement objet ne doit pas être une référence.
Je tiens à préciser certaines idées fausses vous semblez avoir qui sont au-delà de l'intention de votre question:
Lorsqu'une classe est destructeur est appelé tous ses membres destructeurs d'être appelé ainsi.
Appel
delete
n'est pas la même que d'appeler le destructeur.delete
appelle explicitement le destructeur et aussi des appelsoperator delete
à l'emplacement des objets, il est en 2 partie chose.Pour un petit peu plus de précisions, je veux offrir la suivante: