2010-07-17 6 views

Répondre

5

auto_ptr gère un pointeur. reset va supprimer le pointeur dont il dispose et pointer vers autre chose.

Donc, vous commencez par auto_ptr p, pointant vers rien. Lorsque vous reset avec new int, il supprime rien, puis pointe vers un int dynamiquement alloué. Vous affectez ensuite 5 à int.

Ensuite, vous reset à nouveau, en supprimant ce int précédemment attribué, puis pointez sur un int nouvellement attribué. Vous affectez ensuite 10 au nouveau int.

Lorsque la fonction renvoie, auto_ptr est hors de portée et son destructeur est appelé, ce qui supprime le dernier int attribué et le programme se termine.

+0

'auto_ptr gère un pointeur' - Est-ce vraiment correct ou gère-t-il la ressource pointée par le pointeur? – Chubsdad

+1

@ Chubsdad: Je dirais que c'est correct de la même manière que dans int = p = new int; delete p; ', on dit communément la dernière expression" supprime 'p'" quand on veut vraiment dire "il supprime la ressource pointée par' p' ". – GManNickG

2

Peut-être que l'exemple serait mieux que:

struct tester { 
    int value; 
    tester(int value) : value(value) 
    { std::cout << "tester(" << value << ")" << std::endl; } 
    ~tester() { std::cout << "~tester(" << value << ")" << std::endl; } 
}; 
int main() { 
    std::auto_ptr<tester> p(new tester(1)); // tester(1) 
    std::cout << "..." << std::endl; 
    p.reset(new tester(2));     // tester(2) followed by ~tester(1) 
    std::cout << "..." << std::endl; 
}           // ~tester(2) 

La ligne importante étant où est passé un nouveau pointeur vers la méthode de réinitialisation. Dans la sortie, vous pouvez voir que le constructeur de tester est appelé, puis le pointeur est transmis à la méthode reset, le pointeur automatique prend en charge la mémoire précédemment gérée et supprime l'objet montrant ~tester(1) dans la sortie. De même, à la fin de la fonction, lorsque le pointeur automatique est hors de portée, il prend en charge l'impression du pointeur enregistré ~test(2)