{{ :lang:cpp:smartptr:cpp_smart_pointers_ebook.pdf |C++ smart pointers fluentcpp}} ====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 #include class A { public: A() { std::cout << "Constructor\n"; } ~A() { std::cout << "Destructor\n"; } }; int main() { std::shared_ptr a = std::make_shared(); a.reset(new A()); a = std::make_shared(); } Sortie : Constructor Constructor Destructor Constructor Destructor Destructor ====Encapsuler fopen/close==== std::unique_ptr fp(std::fopen(filename.c_str(), "r"), &fclose); [[https://stackoverflow.com/questions/26360916/using-custom-deleter-with-unique-ptr|using custom deleter with unique_ptr]] {{ :lang:cpp:smartptr:c_-_using_custom_deleter_with_unique_ptr_-_stack_overflow_28_12_2022_10_34_58_.html |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> destination; ===Différencier empty et expired=== Sans passer par ''.lock()'' pour ''empty()''. #include #include class A {}; int main() { { std::weak_ptr aa; if (!aa.owner_before(std::weak_ptr{}) && !std::weak_ptr{}.owner_before(aa)) { std::cout << "empty1\n"; } if (aa.expired()) { std::cout << "expired1\n"; } } { std::shared_ptr a; std::weak_ptr aa = a; if (!aa.owner_before(std::weak_ptr{}) && !std::weak_ptr{}.owner_before(aa)) { std::cout << "empty2\n"; } if (aa.expired()) { std::cout << "expired2\n"; // False } } { std::weak_ptr aa; { std::shared_ptr a = std::make_shared(); aa = a; if (!aa.owner_before(std::weak_ptr{}) && !std::weak_ptr{}.owner_before(aa)) { std::cout << "empty3\n"; // False } if (aa.expired()) { std::cout << "expired3\n"; // False } } if (!aa.owner_before(std::weak_ptr{}) && !std::weak_ptr{}.owner_before(aa)) { std::cout << "empty4\n"; // False } if (aa.expired()) { std::cout << "expired4\n"; } } return 0; }