{"id":655,"date":"2010-08-17T18:56:17","date_gmt":"2010-08-17T17:56:17","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=655"},"modified":"2010-08-17T18:59:25","modified_gmt":"2010-08-17T17:59:25","slug":"bug-csimplemap-und-csimplearray-fuehren-bei-verwendung-von-setatindex-zu-einem-leak","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2010\/08\/17\/bug-csimplemap-und-csimplearray-fuehren-bei-verwendung-von-setatindex-zu-einem-leak\/","title":{"rendered":"Bug: CSimpleMap und CSimpleArray f\u00fchren bei Verwendung von SetAtIndex zu einem Leak"},"content":{"rendered":"<p>Wieder einmal ein Bug, der seit <em>VC-2005 <\/em>bekannt ist und in meinen Augen unm\u00f6glich als <strong><em>by design <\/em><\/strong>abgetan werden darf.<\/p>\n<p>Das Problem ist simpel, wenn man die Funktion <em>SetAtIndex<\/em> in den Klassen <em>CSimpleMap<\/em> und <em>CSimpleArray<\/em> angewendet wird, dann wird f\u00fcr das bestehende Element in der Map oder im Array kein Destruktor aufgerufen. D.h. eine <em>CSimpleMap&lt;CString,&#8230;&gt; <\/em>bzw. ein <em>CSimpleArray&lt;CString&gt;<\/em> f\u00fchrt mit der Verwendung von <em>SetAtIndex <\/em>sofort zu Leaks.<\/p>\n<p>T\u00fcckisch in reinen <em>ATL<\/em> Projekten, weil hier der <em>CRT<\/em> Heap nicht benutzt wird und die Speicherleaks durch die <em>CRT<\/em> nicht entdeckt werden, weil der <em>Win32<\/em> Heap zum Einsatz kommt.<\/p>\n<p>Hier ist der Bug zu finden, inkl. der in meinen Augen korrekten Implementierung:<br \/>\n<a href=\"https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/298324\/csimplemap-setatindex-do-not-call-a-ditructor\">https:\/\/connect.microsoft.com\/VisualStudio\/feedback\/details\/298324\/csimplemap-setatindex-do-not-call-a-ditructor<\/a><\/p>\n<p>F\u00fcr mich ist besonders diese Antwort \u00e4u\u00dferst fragw\u00fcrdig:<\/p>\n<blockquote><p>CSimpleMap wasn&#8217;t really designed to work for types that needed destruction. The docs state it is limited and you should use CAtlMap instead.<\/p><\/blockquote>\n<p>Dieser Satz und dieser Hinweis ist in keiner Doku zu finden. Die Doku liest sich ganz anders:<br \/>\n<a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/d1xc3983(VS.100).aspx\">http:\/\/msdn.microsoft.com\/en-us\/library\/d1xc3983(VS.100).aspx<\/a><\/p>\n<blockquote><p><strong>CSimpleMap<\/strong> provides support for a simple mapping array of <strong><em>any given type T<\/em><\/strong>, managing an unordered array of key elements and their associated values.<\/p><\/blockquote>\n<p><strong>Man kann nur raten <em>SetAtIndex<\/em> nicht zu verwenden, sondern nur <em>SetAt<\/em> oder den operator[] \u2757<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wieder einmal ein Bug, der seit VC-2005 bekannt ist und in meinen Augen unm\u00f6glich als by design abgetan werden darf. Das Problem ist simpel, wenn man die Funktion SetAtIndex in den Klassen CSimpleMap und CSimpleArray angewendet wird, dann wird f\u00fcr das bestehende Element in der Map oder im Array kein Destruktor aufgerufen. D.h. eine CSimpleMap&lt;CString,&#8230;&gt; &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2010\/08\/17\/bug-csimplemap-und-csimplearray-fuehren-bei-verwendung-von-setatindex-zu-einem-leak\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eBug: CSimpleMap und CSimpleArray f\u00fchren bei Verwendung von SetAtIndex zu einem Leak\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[25,30,4,3,27,172],"tags":[366,99,370,352,55,36,44,171],"class_list":["post-655","post","type-post","status-publish","format-standard","hentry","category-atl","category-c","category-mfc","category-programmieren","category-vs2008","category-vs2010","tag-atl","tag-bug","tag-c","tag-mfc","tag-msdn","tag-vs-2005","tag-vs-2008","tag-vs-2010"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/655","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=655"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/655\/revisions"}],"predecessor-version":[{"id":656,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/655\/revisions\/656"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=655"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=655"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=655"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}