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
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
Il faut utiliser le comparateur owner_less
.
std::map<U, T, std::owner_less<U>> destination;
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; }