lang:cpp:smartptr
Table des matières
Durée de vie
Lors d'un reset
, le nouvel objet commence par être construit avant de détruire le précédent. Si les objets ont une place importante en mémoire, il peut être intéressant de commencer par faire un reset()
avant de faire le reset(…)
.
#include <iostream> #include <memory> class A { public: A() { std::cout << "Constructor\n"; } ~A() { std::cout << "Destructor\n"; } }; int main() { std::shared_ptr<A> a = std::make_shared<A>(); a.reset(new A()); a = std::make_shared<A>(); }
Sortie :
Constructor Constructor Destructor Constructor Destructor Destructor
Encapsuler fopen/close
std::unique_ptr<FILE, decltype(&fclose)> fp(std::fopen(filename.c_str(), "r"), &fclose);
using custom deleter with unique_ptr Archive du 14/10/2014 le 28/12/2022
weak_ptr
std::weak_ptr en tant que clé dans un conteneur
Il faut utiliser le comparateur owner_less
.
std::map<U, T, std::owner_less<U>> destination;
Différencier empty et expired
Sans passer par .lock()
pour empty()
.
#include <iostream> #include <memory> class A {}; int main() { { std::weak_ptr<A> aa; if (!aa.owner_before(std::weak_ptr<A>{}) && !std::weak_ptr<A>{}.owner_before(aa)) { std::cout << "empty1\n"; } if (aa.expired()) { std::cout << "expired1\n"; } } { std::shared_ptr<A> a; std::weak_ptr<A> aa = a; if (!aa.owner_before(std::weak_ptr<A>{}) && !std::weak_ptr<A>{}.owner_before(aa)) { std::cout << "empty2\n"; } if (aa.expired()) { std::cout << "expired2\n"; // False } } { std::weak_ptr<A> aa; { std::shared_ptr<A> a = std::make_shared<A>(); aa = a; if (!aa.owner_before(std::weak_ptr<A>{}) && !std::weak_ptr<A>{}.owner_before(aa)) { std::cout << "empty3\n"; // False } if (aa.expired()) { std::cout << "expired3\n"; // False } } if (!aa.owner_before(std::weak_ptr<A>{}) && !std::weak_ptr<A>{}.owner_before(aa)) { std::cout << "empty4\n"; // False } if (aa.expired()) { std::cout << "expired4\n"; } } return 0; }
lang/cpp/smartptr.txt · Dernière modification : de root