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

Les deux révisions précédentesRévision précédente
lang:cpp:smartptr [2022/12/28 10:35] – Ajout de "Encapsuler fopen/close" rootlang:cpp:smartptr [2024/01/11 17:00] (Version actuelle) – Ajout de "Différencier empty et expired" root
Ligne 31: Ligne 31:
 Destructor Destructor
 Destructor Destructor
-</code> 
- 
-====std::weak_ptr en tant que clé dans un conteneur==== 
-Il faut utiliser le comparateur ''owner_less''. 
-<code cpp> 
-std::map<U, T, std::owner_less<U>> destination; 
 </code> </code>
  
Ligne 162: Ligne 156:
  
 [[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}} [[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''.
 +<code cpp>
 +std::map<U, T, std::owner_less<U>> destination;
 +</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.1672220144.txt.gz · Dernière modification : 2022/12/28 10:35 de root