{"id":2334,"date":"2015-04-20T12:38:51","date_gmt":"2015-04-20T12:38:51","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=2334"},"modified":"2016-08-06T12:44:02","modified_gmt":"2016-08-06T12:44:02","slug":"les-pointeurs-intelligents-smart-pointers","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=2334","title":{"rendered":"Les pointeurs intelligents"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/04\/AymB9.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-5214\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/04\/AymB9.png\" alt=\"AymB9\" width=\"373\" height=\"297\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/04\/AymB9.png 373w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/04\/AymB9-300x239.png 300w\" sizes=\"(max-width: 373px) 100vw, 373px\" \/><\/a><\/p>\n<p><strong>Intro : <\/strong><\/p>\n<p>Les pointeurs intelligents sont une extension des pointeurs bruts et ont \u00e9t\u00e9 invent\u00e9s afin <strong>d&rsquo;\u00e9viter les fuites de m\u00e9moire<\/strong>.<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Le principe est qu&rsquo;un <em>pointeur intelligent<\/em> encapsule un <em>pointeur brut : <\/em>le pointeur habituel et le muni d&rsquo;un syst\u00e8me de <strong>lib\u00e9ration automatique<\/strong> de la m\u00e9moire. Il suit le principe <em>RAII<\/em>.<\/p>\n<p>C&rsquo;est principalement autour de la notion de \u00ab\u00a0dur\u00e9e de vie\u00a0\u00bb qu&rsquo;un pointeur tient son utilit\u00e9. En effet le pointeur intelligent op\u00e8re sur les actions de <em>cr\u00e9ation<\/em>, de <em>copie<\/em>, de <em>destruction<\/em>, etc&#8230; d&rsquo;un objet.<\/p>\n<p>Dans la version du C++11 il existe <strong>trois types<\/strong> diff\u00e9rents de pointeurs intelligents.<\/p>\n<p><em>&#8211; unique_ptr<\/em>, le pointeur ne peut <strong>pas \u00eatre partag\u00e9<\/strong> (il ne peut y avoir qu&rsquo;un seul propri\u00e9taire).<br \/>\nIl est pr\u00e9f\u00e9rable d&rsquo;utiliser ce type de pointeur plut\u00f4t que l&rsquo;ancien type de pointeur (d&rsquo;avant C++11) : <em>auto_ptr<\/em>. En effet auto_ptr ne dispose pas d&rsquo;un syst\u00e8me de protection de la copie !<\/p>\n<p><em>&#8211; shared_ptr<\/em>, le pointeur peut \u00eatre partag\u00e9e par un syst\u00e8me de <em>comptage de<\/em> <em>r\u00e9f\u00e9rence.<\/em><\/p>\n<p>L&rsquo;id\u00e9e est qu&rsquo;un pointeur intelligent est automatiquement d\u00e9truit lorsqu&rsquo;il sort de port\u00e9e du bout de code.<\/p>\n<p>Voici les <strong>op\u00e9rateurs surcharg\u00e9s<\/strong> d&rsquo;un pointeur intelligent :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\ntemplate &lt;typename T&gt;\r\nclass PointeurIntelligent\r\n{\r\n\u00a0\u00a0\u00a0 T* operator-&gt;() const;\r\n\u00a0\u00a0\u00a0 T&amp; operator*() const;\r\n};\r\n<\/pre>\n<p><strong><br \/>\nExemple :<\/strong><\/p>\n<p>Une fonction retournant un pointeur : une fois retourn\u00e9 on ne sait pas <em>o\u00f9<\/em>, <em>quand<\/em> et <em>comment<\/em> lib\u00e9rer la m\u00e9moire allou\u00e9e par ce pointeur !<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;memory&gt;\r\n\r\nData* getData();\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Mais depuis C++11, on peut utiliser un type le pointeur intelligent nomm\u00e9 <em>unique_ptr<\/em> comme suit : <em><br \/>\n<\/em><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;memory&gt;\r\n\r\nstd::unique_ptr&lt;Data&gt; getData();\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Il sera d\u00e9truit automatiquement \u00e0 la fin de la port\u00e9e du bloc de code ! Comme le pointeur brut est encapsul\u00e9 dans l&rsquo;objet <strong>unique_ptr&lt;&gt;<\/strong> : il sera aussi d\u00e9truit avec. Une de ses particularit\u00e9 est qu&rsquo;il a toujours un <strong>unique propri\u00e9taire<\/strong>. Mais la fonction <strong>std::move<\/strong> permet d&rsquo;\u00e9changer celui-ci.<\/p>\n<p>Un autre type de pointeur intelligent est le <strong>shared_ptr<\/strong>, il peut y \u00eatre adjoint<strong> plusieurs r\u00e9f\u00e9rences<\/strong>. Lorsque la derni\u00e8re r\u00e9f\u00e9rence est disjointe, le pointeur est <em>d\u00e9truit<\/em> !<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;memory&gt;\r\n\r\nstd::shared_ptr&lt;Data&gt; getData();\r\n<\/pre>\n<p><strong><br \/>\n<\/strong>Pour finir, il est important de noter que l&rsquo;on peut cr\u00e9er un objet sur le tas en utilisant std::unique_ptr&lt;Objet&gt; !!<\/p>\n<p><strong>R\u00e9sum\u00e9 : <\/strong><\/p>\n<p>Nous avons pr\u00e9sent\u00e9 le concept et les objets des pointeurs intelligents du C++11 !<\/p>\n<p><strong>R\u00e9f\u00e9rences :<\/strong><\/p>\n<p>&#8211; https:\/\/msdn.microsoft.com\/fr-fr\/library\/hh279674.aspx<\/p>\n<p>&#8211; http:\/\/en.wikipedia.org\/wiki\/Smart_pointer<\/p>\n<p>&#8211; http:\/\/www.informit.com\/articles\/article.aspx?p=2085179<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Les pointeurs intelligents sont une extension des pointeurs bruts et ont \u00e9t\u00e9 invent\u00e9s afin d&rsquo;\u00e9viter les fuites de m\u00e9moire. Explications : Le principe est qu&rsquo;un pointeur intelligent encapsule un pointeur brut : le pointeur habituel et le muni d&rsquo;un syst\u00e8me de lib\u00e9ration automatique de la m\u00e9moire. Il suit le principe RAII. C&rsquo;est principalement [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/2334"}],"collection":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2334"}],"version-history":[{"count":72,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/2334\/revisions"}],"predecessor-version":[{"id":5367,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/2334\/revisions\/5367"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2334"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2334"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2334"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}