<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Destructor wird aufgerufen, speicher wird trotzdem nicht freigegeben, was ist da los ?]]></title><description><![CDATA[<p>Hallo liebe Community, habe schon wieder ein Problem <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Hab eine einfache Linked List in C++ geschrieben, erstellen hinzufügen und löschen sollte funktioniern, der destructor wird auch aufgerufen, aber wenn ich z.B. meine Liste testen will, und sie mit 10.000 Elementen fülle kann ich im Taskmanager beobachten wie der Speicher immer steigt und steigt, was auch normal ist, aber wenn der Anwendungsblock verlassen wird, wo die Liste erstellt wurde, wird der Speicher nicht freigegeben !</p>
<p>Woran kann das liegen ?? Wie gesagt, der destructor wird von jedem Elemnt aufgerufen, auch von der Basisklasse (dort ist er virtual).</p>
<p>Freigegeben wird ordnungsgemäß mit delete zeiger; ich verwende Code::Blocks mit mingw, und windows xp prof sp2.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/219224/destructor-wird-aufgerufen-speicher-wird-trotzdem-nicht-freigegeben-was-ist-da-los</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 11:41:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219224.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 Jul 2008 22:38:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Destructor wird aufgerufen, speicher wird trotzdem nicht freigegeben, was ist da los ? on Wed, 30 Jul 2008 22:38:29 GMT]]></title><description><![CDATA[<p>Hallo liebe Community, habe schon wieder ein Problem <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Hab eine einfache Linked List in C++ geschrieben, erstellen hinzufügen und löschen sollte funktioniern, der destructor wird auch aufgerufen, aber wenn ich z.B. meine Liste testen will, und sie mit 10.000 Elementen fülle kann ich im Taskmanager beobachten wie der Speicher immer steigt und steigt, was auch normal ist, aber wenn der Anwendungsblock verlassen wird, wo die Liste erstellt wurde, wird der Speicher nicht freigegeben !</p>
<p>Woran kann das liegen ?? Wie gesagt, der destructor wird von jedem Elemnt aufgerufen, auch von der Basisklasse (dort ist er virtual).</p>
<p>Freigegeben wird ordnungsgemäß mit delete zeiger; ich verwende Code::Blocks mit mingw, und windows xp prof sp2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556732</guid><dc:creator><![CDATA[Gsast234523]]></dc:creator><pubDate>Wed, 30 Jul 2008 22:38:29 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor wird aufgerufen, speicher wird trotzdem nicht freigegeben, was ist da los ? on Wed, 30 Jul 2008 22:45:50 GMT]]></title><description><![CDATA[<p>Mir ist gerade eingefallen was vielleicht schuld daran sein kann:</p>
<p>Ich erzeuge die LinkedList in einer Funktion und lasse sie dort auch befüllen, also eine Initialisierung + eine Schleife wo die Liste befüllt wird. Kann es sein das der Compiler die Funktion als Inline verwendet ???</p>
<p>Dann wäre es klar warum der Speicher im Taskmanager nicht wieder fällt.</p>
<p>Gibt es eine möglichkeit zu bestimmen ob inline oder nicht ??? (Einige Compiler sind ja schon so klug und entscheiden selbst ob inline oder nicht, und die Angabe von inline ist nur ein Vorschlag für den Compiler, aber kein garant das die Funktion als inline behandlet wird). <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556733</guid><dc:creator><![CDATA[Gast235225257]]></dc:creator><pubDate>Wed, 30 Jul 2008 22:45:50 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor wird aufgerufen, speicher wird trotzdem nicht freigegeben, was ist da los ? on Thu, 31 Jul 2008 05:53:37 GMT]]></title><description><![CDATA[<p>Was der Taskmanager sagt ist Nebensache. Wenn du im Programmcode den Speicher wieder freigibst, heißt das nicht dass der Speicher auf Betriebssystemebene sofort dem Porgramm wieder weggenommen wird. Das OS ist vermutlich umsichtig genug, um den eben benutzten Speicher erstmal weiterhin dem entsprechenden Prozess zuzuordnen, falls der nochmal für irgendwas Speicher anfordern sollte. Wenn der Destruktor aufgerufen wird und du den Aufruf nicht explizit machst (sondern nur über delete), dann wird der Speicher auch freigegeben. (Okay, vorausgesetzt du benutzt einen standardkonformen Compiler und du oder deine benutzten Bibliotheken haben operator delete nicht überladen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556758</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 31 Jul 2008 05:53:37 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor wird aufgerufen, speicher wird trotzdem nicht freigegeben, was ist da los ? on Thu, 31 Jul 2008 11:57:09 GMT]]></title><description><![CDATA[<p>Bist du dir sicher, dass der Destruktor auch alles sauber aufräumt?<br />
Ohne Code können wir leider nicht viel dazu sagen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556986</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 31 Jul 2008 11:57:09 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor wird aufgerufen, speicher wird trotzdem nicht freigegeben, was ist da los ? on Thu, 31 Jul 2008 12:03:09 GMT]]></title><description><![CDATA[<p>Euch ist schon klar, dass new/delete den Speicher nicht jedes mal vom Betriebssystem holen, sondern einen Pool haben, das heißt, dass deine Laufzeitumgebung den Speicher durchaus noch belegt haben kann falls du demnächst wieder ordentlich Speicher brauchst.<br />
Und so lange es im System noch viel freien Speicher gibt hat diese auch keinen Grund ihn sofort wieder herzugeben.</p>
<p>Benutze doch mal die Debugging Möglichkeiten deines Compilers, der zeigt dir normalerweise Leaks an.<br />
Beim MSVC kannst du mal einen Blick in die debug.h werfen, dort gibt es auf jeden Fall eine entsprechende Methode.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556989</guid><dc:creator><![CDATA[Tippgeber]]></dc:creator><pubDate>Thu, 31 Jul 2008 12:03:09 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor wird aufgerufen, speicher wird trotzdem nicht freigegeben, was ist da los ? on Thu, 31 Jul 2008 12:47:53 GMT]]></title><description><![CDATA[<p>Danke für die vielen Antworten.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@Pumuckl</a><br />
Dachte dass das OS den Speicher gleich freigibt und man es im Taskmanager sieht, so war es auch bei meinem letzten Programm (war aber in C geschrieben).<br />
Hört sich jedenfalls logisch an. Danke</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a><br />
Der Destructor räumt alles auf, es gibt nämlich nur einen Zeiger, und der wird mit delete gelöscht. Ansonsten enthält ein Knoten keine Daten (bis auf einen Integer) die gelöscht werden müssen.</p>
<p>@Tippgeber<br />
Im System gibt es noch genügend Speicher, bei den Tests kam das Programm auf ca. 4000kb Speicher (stand im Taksmanager) beim starte hatte es nur 800 - 900kb.</p>
<p>Kenne mich mit den Debugging Möglichkeiten von Compilern nicht aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /> (benutze die gnu toolchain). Werd mir mal die debug.h von MSVC ansehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Wie überprüft ihr eigentlich eure Programme/Projekte auf Speicherleaks ?? (außer mit den debugging funktionen des Compilers)</p>
<p>Danke an alle für die Antworten !!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557018</guid><dc:creator><![CDATA[Gast4571248]]></dc:creator><pubDate>Thu, 31 Jul 2008 12:47:53 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor wird aufgerufen, speicher wird trotzdem nicht freigegeben, was ist da los ? on Thu, 31 Jul 2008 12:56:48 GMT]]></title><description><![CDATA[<p>Gast4571248 schrieb:</p>
<blockquote>
<p>Wie überprüft ihr eigentlich eure Programme/Projekte auf Speicherleaks ?? (außer mit den debugging funktionen des Compilers)</p>
</blockquote>
<p>Möglichst RAII, smartpointer etc. benutzen und die Speicheranforderungen an möglichst wenig Stellen machen, so sind die Stellen wo überhaupt triviale Speicherlecks auftreten können nur wenige und meist gut manuell zu überprüfen. Komplizierter wirds bei Ringreferenzen, da muss man dann im Design drauf achten dass die nicht auftreten (können) bzw explizit aufgelöst werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557022</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 31 Jul 2008 12:56:48 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor wird aufgerufen, speicher wird trotzdem nicht freigegeben, was ist da los ? on Thu, 31 Jul 2008 13:04:29 GMT]]></title><description><![CDATA[<p>die msvc runtime bietet dafür hilfreiche funktionen an.</p>
<p><a href="http://msdn.microsoft.com/en-us/library/5at7yxcs.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/5at7yxcs.aspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557027</guid><dc:creator><![CDATA[leak checker #1]]></dc:creator><pubDate>Thu, 31 Jul 2008 13:04:29 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor wird aufgerufen, speicher wird trotzdem nicht freigegeben, was ist da los ? on Thu, 31 Jul 2008 13:06:08 GMT]]></title><description><![CDATA[<p>Es gibt spezielle Speicherleck-Detektoren:<br />
<a href="http://search.live.com/results.aspx?q=c%2B%2B+leak+detector" rel="nofollow">http://search.live.com/results.aspx?q=c%2B%2B+leak+detector</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557028</guid><dc:creator><![CDATA[BarnieGeroellheimer]]></dc:creator><pubDate>Thu, 31 Jul 2008 13:06:08 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor wird aufgerufen, speicher wird trotzdem nicht freigegeben, was ist da los ? on Thu, 31 Jul 2008 13:12:54 GMT]]></title><description><![CDATA[<p>Was sind Ringreferenzen ? Hab gegooglt aber nichts gefunden.</p>
<p>Das was du gesagt hast sind Maßnahmen um sich vor Speicherleaks vorzubeugen, aber ich meinte eher, wenn ihr das Programm testen wollt, ob auch tatsächlich niregends ein Leak ist, wie macht ihr das.</p>
<p>Auf smartpointer und RAII auszuweichen ist zwar gut, aber da ich C++ noch nicht so gut kann, werd ich erst später darauf ausweichen.</p>
<p>Hab jetzt mal zu Testzwecken in C ein kleines Programm geschrieben welches nur mit malloc 1024.000 byte anfordert, und danach wieder freigibt, und auch hier sieht man im Taskmanager nur den Speicher ansteigen aber nicht fallen.</p>
<p>Also das Problem hat sich damit glaub ich erledigt, aber dazugelernt hat man wieder was <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Sehr tolle/s Community/Forum <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557033</guid><dc:creator><![CDATA[Gast23582538]]></dc:creator><pubDate>Thu, 31 Jul 2008 13:12:54 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor wird aufgerufen, speicher wird trotzdem nicht freigegeben, was ist da los ? on Thu, 31 Jul 2008 13:16:56 GMT]]></title><description><![CDATA[<p>@letzten 2 Posts</p>
<p>Danke für die Links, hab geschrieben während ihr gepostet habt.</p>
<p>Was ich noch bemerkt habe:</p>
<p>Nachdem free() aufgerufen wird, sieht man im Taskmanager den Speicher um 4 kbyte kleiner werden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> wenn ich free weglasse bleibt er so wie er ist (nach malloc).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557035</guid><dc:creator><![CDATA[Gast25285]]></dc:creator><pubDate>Thu, 31 Jul 2008 13:16:56 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor wird aufgerufen, speicher wird trotzdem nicht freigegeben, was ist da los ? on Thu, 31 Jul 2008 13:17:10 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Wenn du im Programmcode den Speicher wieder freigibst, heißt das nicht dass der Speicher auf Betriebssystemebene sofort dem Porgramm wieder weggenommen wird. Das OS ist vermutlich umsichtig genug, um den eben benutzten Speicher erstmal weiterhin dem entsprechenden Prozess zuzuordnen, falls der nochmal für irgendwas Speicher anfordern sollte.</p>
</blockquote>
<p>ich denken, du beschreibst den sachverhalt nicht richtig. das speichermanagment des prozesses arbeitet normalerweise unabhängig von dem des os und ruft dieses nur auf, wenn es neuen speicher haben will/welchen zurückgeben will. aber aus performancegründen nicht unbedingt auf basis von einzelnen freigaben/reservierungen. die modernen speicherlibs hand haben es dann so, dass sie speicherbereiche für kleine objekte in einer gewissenen menge an seiten ablegen. die menge kann wachsen, wird aber nie kleiner, da der verwaltungsaufwand sich im normalfall schlicht nicht lohnt. lediglich größere speicherbereiche werden tatsächlich an das system wieder zurückgegeben. das ist zumindest die funktionweis auf den unixoiden systemen, die ich kenne. im klassischen unix wurde sogar vollständig darauf verzichtet, speicher an das system zurückzugeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557036</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Thu, 31 Jul 2008 13:17:10 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor wird aufgerufen, speicher wird trotzdem nicht freigegeben, was ist da los ? on Thu, 31 Jul 2008 13:21:23 GMT]]></title><description><![CDATA[<p>Gast23582538 schrieb:</p>
<blockquote>
<p>Was sind Ringreferenzen ? Hab gegooglt aber nichts gefunden.</p>
</blockquote>
<p>Wenn du über einen Smartpointer ein Objekt referenzierst, wird er das Objekt zerstören, sobald er selber zerstört wird (bzw. sobald der letzte smart pointer zerstört wird der das Objekt referenziert), du musst also nicht explizit delete aufrufen oder dich anderweitig um die Zerstörung des Objektes kümmern. So kannst du z.B. einen Baum aufbauen und nur das root-objekt halten, sobald du es zerstörst wird automatisch alles was daran hängt zerstört.<br />
Anders ist das, wenn z.B Objekt A eine Referenz auf B hält, B wiederum auf C udn C auf A. Wenn nicht eins der Objekte explizit zerstört wird gibts immer ein anderes Objekt, was darauf eine Referenz hält und die Objekte bleiben im Speicher, selbst wenns von außerhalb des Ringes keine Referenzen mehr darauf gibt. Da solche Ringe zu sehr komplizierten Gebilden anwachsen können, kann es schwierig sein, solche unabhängigen Gebilde zu erkennen und zu zerstören. Sprachen mit Garbage-Collectoren (z.B. Java) können mit sowas Probleme bekommen, zumal dem programmierer dort die Problematik tendenziell weniger bewusst ist, da er sich normalerweise garnicht um Speicherverwaltung kümmern braucht (oder zumindest viel weniger als in C++)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557041</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 31 Jul 2008 13:21:23 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor wird aufgerufen, speicher wird trotzdem nicht freigegeben, was ist da los ? on Thu, 31 Jul 2008 13:47:13 GMT]]></title><description><![CDATA[<p>Danke, tolle Erklärung !</p>
<p>Habe jetzt mein Programm mit einem memory leak detector getestet, kein Fehler gefunden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557060</guid><dc:creator><![CDATA[Gast2352]]></dc:creator><pubDate>Thu, 31 Jul 2008 13:47:13 GMT</pubDate></item></channel></rss>