7
votes

C ++: Supprimer une structure?

J'ai une structure contenant des pointeurs: xxx

J'ai un vecteur de pointeurs partagés à ces structures: xxx

VEC est attribué sur la pile. Lorsqu'il passe hors de portée à la fin de la méthode, son destructeur sera appelé. (Droite?) Cela va à son tour appeler le destructeur de chaque élément du vecteur. (Droite?) Calling Supprimer FOO Supprimer uniquement les pointeurs tels que foo.f ou libérent-il réellement la mémoire du tas?


0 commentaires

6 Réponses :


2
votes

Il ne supprime que les pointeurs.


0 commentaires

2
votes

Vous n'appelez pas supprimer f où f est un objet de type foo si f est une pile allouée. Vous n'appelez pas non plus Supprimer F sur un objet de Type alloué de type FOO Si cette adresse est stockée dans un pointeur partagé. Shared_PTR Objets appellera Supprimer pour vous lorsque la dernière référence est libérée.

Puisque votre vecteur stocke les pointeurs intelligents, ils tomberont également hors de portée lorsque votre vecteur tombe hors de portée et que le destructeur FOO sera appelé et une mémoire associée libérée. La mémoire de FOO n'est que la taille de 3 pointeurs cependant. Pas ce que ces pointeurs contiennent.

Si les membres de foo sont alloués, vous devrez alors supprimer celles séparément. Par exemple, peut-être dans le FOO Destructor si la mémoire qu'ils indiquent ne sont pas partagées entre des objets.


Lorsqu'il passe hors de portée à la fin de la méthode, son destructeur sera appelé. (Droite?)

Droite.

Cela appellera à son tour le destructeur de chaque élément du vecteur. (Droite?)

droite. Le destructeur du pointeur intelligent.

ou fait-il effectivement libérer la mémoire du tas?

Il appelle le destructeur du pointeur intelligent, s'il n'y a plus de références à ce pointeur, l'objet qu'il contient sera supprimé et sa mémoire sera libérée.


0 commentaires

16
votes
delete foo;
will delete the memory allocated to the foo structure, which includes the three pointers.  But the memory pointed to by the pointers themselves will only be deleted if you implement a destructor that explicitly deletes them.

1 commentaires

Ou alternativement, changez F, D et M pour utiliser des pointeurs auto ou partagés.



1
votes

Il semble y avoir un mélange terminologique dans votre question. Destructeur du vecteur appellera des destructeurs pour partaged_ptr , ce qui permettra à son tour Supprimer sur leurs pointeurs stockés (si nécessaire).

appeler Supprimer foo , où foo est un pointeur sur struct foo , appellera le destructeur de struct foo Ensuite, annouez la mémoire occupée par * foo .

Destructeur de ce qui précède struct foo n'est absolument rien. C'est trivial. Si vous n'effectuez aucune tentative pour annouez la mémoire pointée par struct foo :: f ou tout autre membre. Pourquoi serait-ce? Il ne peut pas savoir si cette mémoire devrait être traitée.

En fait, parce que struct foo :: ~ FOO est trivial, les compilateurs ne tenteront normalement pas de l'appeler.


0 commentaires

10
votes

Si vous avez alloué de manière dynamique foo code>, par exemple:

foo* f = new foo;


0 commentaires

0
votes

quand il [VEC] passe hors de portée à la fin de la méthode, son destructeur sera appelé. (Non?) Strong>
Correct

qui fera appel à son tour le destructeur de chaque élément du vecteur. (Non?) Strong>
CORRECT, cela supprimera les éléments Shared_PTR dans le conteneur, et s'ils sont les derniers aussi les éléments dont ils partagent. P>

appelle Supprimer FOO ... strong>
Vous ne pouvez pas supprimer foo, c'est une structure. Vous pouvez supprimer une instance de foo.
Appeler Supprimer appelle le destructeur et libère la mémoire de la FOO STRIT. P>

Le FOO Destructor supprime-t-il que les pointeurs tels que FOO :: F, ou fait-il effectivement libérer la mémoire du tas? strong>
Cela dépend du destructo, dans ce cas, vous avez un destructeur par défaut et ...
Non, dans l'exemple de code suivant, vous pouvez voir certaines des raisons pour lesquelles le destructeur par défaut associé à FOO ne peut pas nettoyer automatiquement les éléments référencés du pointeur. P>

{
 char ca='a', *cb=new char;
 int *i = (int*)malloc(sizeof(int));
 foo a;
 shared_ptr<foo> b = new foo();
 a.f = &ca;
 a.d = i;
 b.f = cb;
}


0 commentaires