2012-01-27 1 views
2

Je suppose qu'un objet libéré à partir d'un ptr_set fuit s'il n'est pas supprimé manuellement. Cependant, le programme de test ci-dessous montre seulement 2 fuites dans valgrind (à partir des lignes 9/13), et aucune fuite pour la ligne 12. Ai-je mal compris release, ou est ptr_container en train de nettoyer d'une façon ou d'une autre?Augmenter la fuite de ptr_container sur 'release'?

#include <iostream> 
#include <boost/ptr_container/ptr_set.hpp> 

typedef boost::ptr_set<int> SetInt; 

int main() { 
    SetInt s; 

    new int(1);    // leak, reported by valgrind 

    s.insert(new int(2)); 
    s.insert(new int(3));  // leak? not reported by valgrind 
    s.insert(new int(4));  // leak, reported by valgrind 

    s.erase(s.begin()); 
    s.release(s.begin());  // release '3' 

    SetInt::auto_type old_int1 = s.release(s.begin()); 
    int *old_int2 = old_int1.release(); 
    std::cout << '\'' << *old_int2 << "' has been released\n"; 
} 

Sortie:

'4' has been released 

Répondre

2

Le destructor 3 est en effet appelé comme vous avez observé. La raison en est que s.release renvoie un pointeur intelligent qui va supprimer l'objet lorsque ce pointeur sort de sa portée. Ainsi, votre ligne:

s.release(s.begin());  // release '3' 

est similaire à l'écriture

{  
    SetInt::auto_type tmp= s.release(s.begin());  // release '3' 
} // at this point the '3' is destroyed. 

objet 4 n'est pas parce que vous dites destructed votre pointeur intelligent old_int1 ne pas le faire.

http://www.boost.org/doc/libs/1_34_0/libs/ptr_container/doc/tutorial.html#new-functions

Questions connexes