IL est dit un peu partout que les ptr les plus utilisés sont ceux du type shared_ptr, hors je ne vois pas trop l'intérêt d'avoir un mécanisme de partage de ptr, bien souvent on a un ptr et il y a un 'seul' propriétaire, je me trompe ?
IL est dit un peu partout que les ptr les plus utilisés sont ceux du type shared_ptr, hors je ne vois pas trop l'intérêt d'avoir un mécanisme de partage de ptr, bien souvent on a un ptr et il y a un 'seul' propriétaire, je me trompe ?
Bonjour,
C'est exact. Si un scoped_ptr suffit, il est préférable de l'utiliser a la place du shared_ptr. (Et fortement préférable a l'auto_ptr)
PS: Sauf si c'est pour faire une "implémentation privé", car la seul le shared_ptr le permettra. (l'auto_ptr aussi, mais la c'est le drame garantie)
en faite les cas d'utilisations des shared m'ont l'air très restreint
Pas tant que ca. Une utilisation très courante, c'est pour faire un conteneur de shared_ptr. Style vector<shared_ptr<MaClass> >. En effet, le vector requiert un objet copyable. Le scoped_ptr ne l'est pas.
Autre exemple, on as un cache d'images(par exemple) en mémoire. Chaque images ne doit pas être supprimée tant qu'elle est utilisée au moins a un endroit dans le programme. C'est un cas typique de propriété partagé, et c'est très courant.
c'est là où c'est un peu space car dans un code comme celui ci où est la notion de partage, au retour de add seul sp est propriétaire du pointeur, hors là on est obliger d'utiliser du shared
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 boost::scoped_ptr<int> add( ) { return boost::scoped_ptr<int>(new int(1)); } int main() { boost::scoped_ptr<int> sp = add(); getchar(); }
EDIT: il faut peut être plutôt utiliser un auto_ptr alors
Ton code compilera pas. Parce que justement le scoped_ptr est pas fait pour ça. (c'est juste une enveloppe RAII-sante)
Pour ça que quand tu dis que c'est le plus utile, je te dis que non, car en général quand j'ai a utiliser un pointeur c'est justement que je veux pouvoir étendre ça durée de vie et le passer de "main en main"
je sais que ça compile pas,c'était pour l'exemple
Mais dans ce cas là un un auto_ptr est peut être le bon outil ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 std::auto_ptr<int> add( ) { return std::auto_ptr<int>(new int(1)); } int main() { std::auto_ptr<int> sp = add(); std::cout << *sp; getchar(); }
C'est en effet dans ce cas uniquement que l'auto_ptr est utile. Mais le shared_ptr est quand même plus safe.
effectivement ça évite ce genre de situation, mais l'auto_ptr conserve donc une propriété intéressante suivant le cas que les autres smart ptr n'ont pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 std::auto_ptr<int> add( ) { return std::auto_ptr<int>(new int(1)); } void add(std::auto_ptr<int> f ) { } int main() { std::auto_ptr<int> sp = add(); add(sp); std::cout << *sp; getchar(); }
D'ailleurs une petite question concernant l'implémetation d'auto ptr :
A quoi sert le dernier constructeur ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 template <class X> class auto_ptr { public: typedef X element_type; // 20.4.5.1 construct/copy/destroy: explicit auto_ptr(X* p =0) throw(); auto_ptr(auto_ptr&) throw(); template <class Y> auto_ptr(auto_ptr<Y>&) throw();
ça s'utilise comment , le code suivant ne passe pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 std::auto_ptr<short> p; std::auto_ptr<int> m(p);
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
Changer quoi ? Ton objectif... short* et int* ne sont pas compatible, il n'y a pas de raison qu'un xxx_ptr<short> ou un xxx_ptr<int> le soient...
Un exemple qui marche (aux erreurs de frappe près) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class A{}; class B : public A {}; auto_ptr<B> ptrB(new B); auto_ptr<A> ptrA(ptrB);
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
Salut.
Y as t'il une réelle différence entre scoped_ptr et auto_ptr?
Si j'ai bien compris scoped_ptr n'est pas copiable alors que auto_ptr oui(mais c'est un transfert de pointeur et non une copie)
Partager