Outils pour utilisateurs

Outils du site


lang:cpp:smartptr

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
lang:cpp:smartptr [2019/10/17 08:45] – Création avec "std::weak_ptr en tant que clé dans un conteneur" rootlang:cpp:smartptr [2025/07/06 16:33] (Version actuelle) – [Préserver l'attribut const sur les pointeurs] : déplacement dans un article dédié root
Ligne 1: Ligne 1:
 +{{ :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(...)''.
 +
 +<code cpp>
 +#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>();
 +}
 +</code>
 +
 +Sortie :
 +
 +<code>
 +Constructor
 +Constructor
 +Destructor
 +Constructor
 +Destructor
 +Destructor
 +</code>
 +
 +
 +====Encapsuler fopen/close====
 +
 +<code cpp>
 +std::unique_ptr<FILE, decltype(&fclose)> fp(std::fopen(filename.c_str(), "r"), &fclose);
 +</code>
 +
 +[[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==== ====std::weak_ptr en tant que clé dans un conteneur====
 Il faut utiliser le comparateur ''owner_less''. Il faut utiliser le comparateur ''owner_less''.
Ligne 5: Ligne 50:
 </code> </code>
  
 +===Différencier empty et expired===
  
 +Sans passer par ''.lock()'' pour ''empty()''.
 +
 +<code cpp>
 +#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;
 +}
 +</code>
lang/cpp/smartptr.1571294723.txt.gz · Dernière modification : de root