2010-01-16 4 views
1

Qu'arrive-t-il à un pointeur si vous libérez un objet appartenant à auto_ptr mais que vous ne l'attribuez pas à un pointeur brut? Il semble que ce soit censé être supprimé, mais il n'a jamais eu l'occasion de le faire. Alors, est-ce qu'il se fuit "dans la nature"?auto_ptr libéré sans affecter sa valeur de retour

void usingPointer(int* p); 

std::auto_ptr<int> point(new int); 
*point = 3; 

usingPointer(point.release()); 

Remarque: Je n'utilise plus auto_ptr, j'utilise maintenant tr1 :: shared_ptr. Cette situation m'a juste rendu curieux.

+0

Changement * "Alors ça se fuit" dans la nature "?" * À * "Alors ça se libère **" dans la nature "?" * Et vous aurez votre réponse, et le inspiration derrière le nom. :) Oui, 'release''ing soulage le' auto_ptr' de toutes les tâches de gestion. – GManNickG

+0

'usingPointer' * pourrait * le supprimer dans cet exemple. Cependant, quand vous voulez un pointeur simple tout en laissant le pointeur intelligent gérer l'objet, vous utiliserez 'point.get()' (aussi avec 'shared_ptr') – UncleBens

Répondre

2

release est supposé ne pas supprimer le point propriété, des docs:

le pointeur interne auto_ptr null pointeur (ce qui indique qu'il pointe vers aucun objet) sans destructing l'objet actuellement a par le auto_ptr.

En outre, il est exagéré de remplacer toutes les utilisations de votre auto_ptr avec tr1::shared_ptr - vous devriez utiliser unique_ptr où une responsabilité partagée n'est pas nécessaire.

+0

Je l'ai remplacé la plupart du temps quand j'ai réalisé que auto_ptr ne s'applique pas Constructeur de copie const, et j'aurais besoin que le pointeur soit copié et utilisé parmi différentes instances d'une classe. –

3

À moins que usingPointer appelle delete sur p, il s'agit d'une fuite de mémoire. Si vous appelez get au lieu de release alors la mémoire sera automatiquement supprimée lorsque point est hors de la portée.

Questions connexes