{"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\/de\/2018\/06\/23\/itgrows\/","title":{"rendered":"Hab keine Angst, sieh zu, wie es w\u00e4chst"},"content":{"rendered":"<p>In diesem Beitrag werde ich \u00fcber meine Missgeschicke mit shared_ptr Smart Pointern sprechen. Nachdem ich die Next-Level-Generation in meinem Spiel <a href=\"https:\/\/gitlab.com\/demensdeum\/Death-Mask\" target=\"_blank\" rel=\"noopener\">Death-Mask<\/a> implementiert hatte, bemerkte ich eine Erinnerung Leck . Jede neue Stufe erh\u00f6hte den verbrauchten RAM um + 1 Megabyte. Es ist <strong>offensichtlich<\/strong>, dass einige Objekte im Speicher verblieben und nicht freigegeben wurden. Um diesen Umstand zu korrigieren, war es notwendig, die korrekte Implementierung von Ressourcen bei \u00dcberlastung des Levels zu implementieren, was offenbar nicht geschehen ist. Da ich intelligente Zeiger verwendet habe, gab es mehrere M\u00f6glichkeiten, dieses Problem zu l\u00f6sen. Die erste bestand darin, den Code manuell zu \u00fcberpr\u00fcfen (lang und langweilig), w\u00e4hrend die zweite darin bestand, die F\u00e4higkeiten des lldb-Debuggers und des libstdc++-Quellcodes auf die M\u00f6glichkeit einer automatischen Nachverfolgung zu untersuchen Z\u00e4hler\u00e4nderungen.<\/p>\n<p>Im Internet liefen alle Ratschl\u00e4ge darauf hinaus, den Code manuell zu \u00fcberpr\u00fcfen, ihn zu reparieren und sich selbst mit Peitschenhieben zu schlagen, nachdem man die problematische Codezeile gefunden hatte. Es wurde auch vorgeschlagen, ein eigenes System f\u00fcr die Arbeit mit dem Speicher zu implementieren, wie es alle gro\u00dfen Projekte tun, die seit den 90er und 2000er Jahren entwickelt wurden, bevor intelligente Zeiger im C++11-Standard eingef\u00fchrt wurden. Ich habe versucht, Haltepunkte im Konstruktor einer Kopie aller shared_ptrs zu verwenden, aber nach mehreren Tagen passierte nichts N\u00fctzliches. Es gab die Idee, Protokollierung zur libstdc++-Bibliothek hinzuzuf\u00fcgen, aber der Arbeitsaufwand erwies sich als enorm.<\/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>Die L\u00f6sung kam mir pl\u00f6tzlich in Form der Verfolgung von \u00c4nderungen in der privaten Variablen shared_ptr &#8211; use_count. Dies kann mithilfe von in lldb integrierten Watchpoints erfolgen. Nach dem Erstellen eines shared_ptr \u00fcber make_shared k\u00f6nnen \u00c4nderungen am Z\u00e4hler in lldb mithilfe der Zeile:<br \/> verfolgt werden<!-- HTML generiert mit hilite.me --><\/p>\n<div style=\"background: #ffffff; overflow: auto; width: auto; border: solid grey; border-width: .1em .1em .1em .8em; padding: .2em .6em;\">\n<pre style=\"margin: 0; line-height: 125%;\">watch <span style=\"color: #008800; font-weight: Bold;\">set<\/span> <span style=\"color: # 008800; Schriftst\u00e4rke: fett;\">var<\/span> camera._M_refcount._M_pi->_M_use_count<\/pre>\n<\/div>\n<p>Wo &#8220;Kamera&#8221; Dies ist ein shared_ptr-Objekt, dessen Z\u00e4hlerstand verfolgt werden muss. Nat\u00fcrlich variieren die Interna von shared_ptr je nach Version von libstdc++, aber das allgemeine Prinzip ist verst\u00e4ndlich. Nach der Installation des Watchpoints starten wir die Anwendungen und lesen den Stacktrace jeder Z\u00e4hler\u00e4nderung, dann schauen wir uns den Code an (sic!), finden das Problem und beheben es. In meinem Fall wurden Objekte nicht aus Cache-Tabellen und Spiellogiktabellen befreit. Ich hoffe, dass diese Methode Ihnen beim Umgang mit Lecks bei der Arbeit mit shared_ptr hilft, und ich liebe dieses Speichertool noch mehr. Viel Spa\u00df beim Debuggen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Beitrag werde ich \u00fcber meine Missgeschicke mit shared_ptr Smart Pointern sprechen. Nachdem ich die Next-Level-Generation in meinem Spiel Death-Mask implementiert hatte, bemerkte ich eine Erinnerung Leck . Jede neue Stufe erh\u00f6hte den verbrauchten RAM um + 1 Megabyte. Es ist offensichtlich, dass einige Objekte im Speicher verblieben und nicht freigegeben wurden. Um diesen<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/de\/2018\/06\/23\/itgrows\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Hab keine Angst, sieh zu, wie es w\u00e4chst&#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":"de","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\/de\/wp-json\/wp\/v2\/posts\/1409","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/comments?post=1409"}],"version-history":[{"count":11,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/1409\/revisions"}],"predecessor-version":[{"id":3979,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/1409\/revisions\/3979"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/media?parent=1409"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/categories?post=1409"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/tags?post=1409"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}