lang:cpp:smartptr
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| lang:cpp:smartptr [2019/11/07 23:29] – Ajout d'une source d'information root | lang: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: | ||
| {{ : | {{ : | ||
| - | ====std:: | + | ====Durée de vie==== |
| - | Il faut utiliser le comparateur '' | + | |
| - | <code cpp> | + | |
| - | std:: | + | |
| - | </ | + | |
| - | ====Préserver l'attribut const sur les pointeurs==== | + | Lors d'un '' |
| - | Il faut utiliser | + | |
| + | <code cpp> | ||
| + | #include < | ||
| + | #include < | ||
| - | Soit la classe commune '' | + | class A { |
| - | + | | |
| - | <code cpp> | + | |
| - | struct X | + | |
| - | { | + | |
| - | | + | |
| - | | + | |
| }; | }; | ||
| - | </ | ||
| - | et le programme commun : | + | int main() { |
| - | + | | |
| - | <code cpp> | + | |
| - | int main() | + | |
| - | { | + | |
| - | | + | |
| - | | + | |
| - | + | ||
| - | | + | |
| - | cy.f(); | + | |
| } | } | ||
| - | |||
| </ | </ | ||
| - | ===Cas avec la classe '' | + | Sortie : |
| - | < | + | < |
| - | struct Y | + | Constructor |
| - | { | + | Constructor |
| - | Y() { } | + | Destructor |
| + | Constructor | ||
| + | Destructor | ||
| + | Destructor | ||
| + | </ | ||
| - | void f() const | ||
| - | { | ||
| - | std::cout << "f (const)\n"; | ||
| - | m_ptrX.g(); | ||
| - | } | ||
| - | void f() | + | ====Encapsuler fopen/ |
| - | { | + | |
| - | std::cout << "f (non-const)\n"; | + | |
| - | m_ptrX.g(); | + | |
| - | } | + | |
| - | // Ici, X est une instance sans pointeur. | + | <code cpp> |
| - | X m_ptrX; | + | std:: |
| - | }; | + | |
| </ | </ | ||
| - | Rendu sans surprise | + | [[https:// |
| - | < | + | ====weak_ptr==== |
| - | f (non-const) | + | |
| - | g (non-const) | + | ====std:: |
| - | f (const) | + | Il faut utiliser le comparateur '' |
| - | g (const) | + | <code cpp> |
| + | std:: | ||
| </ | </ | ||
| - | Si la méthode '' | + | ===Différencier empty et expired=== |
| - | ===Cas avec un pointeur unique=== | + | Sans passer par '' |
| <code cpp> | <code cpp> | ||
| - | struct Y | + | #include < |
| - | { | + | #include < |
| - | Y() : m_ptrX{} { } | + | |
| - | void f() const | + | class A {}; |
| + | |||
| + | int main() { | ||
| { | { | ||
| - | std::cout << | + | std::weak_ptr<A> aa; |
| - | | + | |
| + | if (!aa.owner_before(std:: | ||
| + | std::cout << " | ||
| + | | ||
| + | if (aa.expired()) { | ||
| + | std::cout << " | ||
| + | } | ||
| } | } | ||
| - | void f() | ||
| { | { | ||
| - | std::cout << | + | std::shared_ptr<A> a; |
| - | | + | std:: |
| + | |||
| + | if (!aa.owner_before(std:: | ||
| + | std::cout << " | ||
| + | | ||
| + | if (aa.expired()) { | ||
| + | std::cout << " | ||
| + | } | ||
| } | } | ||
| - | std::unique_ptr<X> m_ptrX; | + | |
| - | }; | + | |
| - | </code> | + | { |
| + | | ||
| + | aa = a; | ||
| - | Rendu : | + | if (!aa.owner_before(std::weak_ptr<A>{}) && !std:: |
| - | + | | |
| - | <code cpp> | + | } |
| - | f (non-const) | + | if (aa.expired()) { |
| - | g (non-const) | + | std::cout << " |
| - | f (const) | + | } |
| - | g (non-const) | + | } |
| - | </code> | + | if (!aa.owner_before(std::weak_ptr<A>{}) && !std::weak_ptr<A>{}.owner_before(aa)) { |
| - | + | | |
| - | On ne respecte la l' | + | } |
| - | + | if (aa.expired()) { | |
| - | ===Cas avec un pointeur unique et propagate_const=== | + | |
| - | + | } | |
| - | Prérequis | + | } |
| - | + | | |
| - | <code cpp> | + | } |
| - | #include < | + | |
| - | | + | |
| - | </code> | + | |
| - | + | ||
| - | Rendu : | + | |
| - | + | ||
| - | <code> | + | |
| - | f (non-const) | + | |
| - | g (non-const) | + | |
| - | f (const) | + | |
| - | g (const) | + | |
| </ | </ | ||
lang/cpp/smartptr.1573165762.txt.gz · Dernière modification : de root
