{"id":1409,"date":"2018-06-23T11:47:41","date_gmt":"2018-06-23T11:47:41","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=1409"},"modified":"2024-12-16T22:32:43","modified_gmt":"2024-12-16T19:32:43","slug":"itgrows","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/fr\/2018\/06\/23\/itgrows\/","title":{"rendered":"N&#8217;aie pas peur, regarde-le grandir"},"content":{"rendered":"<p>Dans cet article, je parlerai de mes m\u00e9saventures avec les pointeurs intelligents shared_ptr. Apr\u00e8s avoir impl\u00e9ment\u00e9 la g\u00e9n\u00e9ration de niveau sup\u00e9rieur dans mon jeu <a href=\"https:\/\/gitlab.com\/demensdeum\/Death-Mask\" target=\"_blank\" rel=\"noopener\">Death-Mask<\/a>, j&#8217;ai remarqu\u00e9 un souvenir fuir . Chaque nouveau niveau donnait une augmentation de + 1 m\u00e9gaoctet \u00e0 la RAM consomm\u00e9e. Il est <strong>\u00e9videmment<\/strong> que certains objets sont rest\u00e9s en m\u00e9moire et ne l&#8217;ont pas lib\u00e9r\u00e9. Pour corriger ce fait, il a fallu mettre en \u0153uvre la bonne mise en \u0153uvre des ressources lorsque le niveau est surcharg\u00e9, ce qui n&#8217;a apparemment pas \u00e9t\u00e9 fait. Depuis que j&#8217;ai utilis\u00e9 des pointeurs intelligents, il y avait plusieurs options pour r\u00e9soudre ce probl\u00e8me, la premi\u00e8re impliquait une r\u00e9vision manuelle du code (longue et ennuyeuse), tandis que la seconde impliquait de rechercher les capacit\u00e9s du d\u00e9bogueur lldb et le code source de libstdc++ pour la possibilit\u00e9 de suivre automatiquement changements de compteur.<\/p>\n<p>Sur Internet, tous les conseils se r\u00e9sumaient \u00e0 r\u00e9viser manuellement le code, \u00e0 le corriger et \u00e0 se frapper avec des fouets apr\u00e8s avoir trouv\u00e9 la ligne de code probl\u00e9matique. Il a \u00e9galement \u00e9t\u00e9 propos\u00e9 d&#8217;impl\u00e9menter son propre syst\u00e8me de travail avec la m\u00e9moire, comme le font tous les grands projets d\u00e9velopp\u00e9s depuis les ann\u00e9es 90 et 2000, avant l&#8217;arriv\u00e9e des pointeurs intelligents dans le standard C++11. J&#8217;ai essay\u00e9 d&#8217;utiliser des points d&#8217;arr\u00eat sur le constructeur d&#8217;une copie de tous les shared_ptrs, mais apr\u00e8s plusieurs jours, rien d&#8217;utile ne s&#8217;est produit. Il y avait une id\u00e9e pour ajouter la journalisation \u00e0 la biblioth\u00e8que libstdc++, mais les co\u00fbts de main d&#8217;\u0153uvre se sont av\u00e9r\u00e9s monstrueux.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1412\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2018\/06\/edwardhacking.png\" alt=\"\" width=\"500\" height=\"375\" srcset=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2018\/06\/edwardhacking.png 500w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2018\/06\/edwardhacking-300x225.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><br \/>\nCowboy Bebop (1998)<\/p>\n<p>La solution m&#8217;est soudainement venue \u00e0 l&#8217;esprit : suivre les modifications apport\u00e9es \u00e0 la variable priv\u00e9e shared_ptr &#8211; use_count. Cela peut \u00eatre fait en utilisant les points de surveillance int\u00e9gr\u00e9s dans lldb. Apr\u00e8s avoir cr\u00e9\u00e9 un shared_ptr via make_shared, les modifications apport\u00e9es au compteur dans lldb peuvent \u00eatre suivies \u00e0 l&#8217;aide de la ligne\u00a0:<br \/><!-- HTML g\u00e9n\u00e9r\u00e9 avec hilite.me --><\/p>\n<div style=\"background: #ffffff; d\u00e9bordement: auto; largeur: auto; bordure: gris uni; largeur de bordure: .1em .1em .1em .8em; remplissage: .2em .6em;\">\n<pre style=\"margin: 0; line-height: 125%;\">regarder <span style=\"color: #008800; font-weight: bold;\">set<\/span> <span style=\"color: # 008800\u00a0; poids de la police\u00a0: gras\u00a0;\">var<\/span> camera._M_refcount._M_pi->_M_use_count<\/pre>\n<\/div>\n<p>O\u00f9 \u00ab\u00a0cam\u00e9ra\u00a0\u00bb\u00a0; il s&#8217;agit d&#8217;un objet shared_ptr dont l&#8217;\u00e9tat du compteur doit \u00eatre suivi. Bien s\u00fbr, les composants internes de shared_ptr varieront en fonction de la version de libstdc++, mais le principe g\u00e9n\u00e9ral peut \u00eatre compris. Apr\u00e8s avoir install\u00e9 le point de surveillance, nous lan\u00e7ons les applications et lisons le stacktrace de chaque changement de compteur, puis nous regardons le code (sic !), trouvons le probl\u00e8me et le r\u00e9parons. Dans mon cas, les objets n&#8217;ont pas \u00e9t\u00e9 lib\u00e9r\u00e9s des tables de cache et des tables de logique de jeu. J&#8217;esp\u00e8re que cette m\u00e9thode vous aidera \u00e0 g\u00e9rer les fuites lorsque vous travaillez avec shared_ptr et j&#8217;aimerai encore plus cet outil de m\u00e9moire. Bon d\u00e9bogage.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans cet article, je parlerai de mes m\u00e9saventures avec les pointeurs intelligents shared_ptr. Apr\u00e8s avoir impl\u00e9ment\u00e9 la g\u00e9n\u00e9ration de niveau sup\u00e9rieur dans mon jeu Death-Mask, j&#8217;ai remarqu\u00e9 un souvenir fuir . Chaque nouveau niveau donnait une augmentation de + 1 m\u00e9gaoctet \u00e0 la RAM consomm\u00e9e. Il est \u00e9videmment que certains objets sont rest\u00e9s en m\u00e9moire<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/fr\/2018\/06\/23\/itgrows\/\">Continue reading <span class=\"screen-reader-text\">&#8220;N&#8217;aie pas peur, regarde-le grandir&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[49,61,52],"tags":[],"class_list":["post-1409","post","type-post","status-publish","format-standard","hentry","category-blog","category-techie","category-tutorials","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"fr","enabled_languages":["en","ru","zh","de","fr","ja","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":false,"content":false,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/1409","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/comments?post=1409"}],"version-history":[{"count":11,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/1409\/revisions"}],"predecessor-version":[{"id":3979,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/1409\/revisions\/3979"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=1409"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=1409"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=1409"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}