<?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[Frage zu Destruktor]]></title><description><![CDATA[<p>Hey!</p>
<p>Ich hab mal zwei Fragen was Objekte betrifft.</p>
<p>1. Wie ihr ja sicher wisst, hat Java einen automatischen GarbageCollector, den man nicht beeinflussen kann. C++ hat das ja aber nicht, man kann mit &quot;delete&quot; Objekte zerstören.</p>
<p>Jetzt meine Frage: Ist das bei Objekten so, die auf dem Heap und dem Stack sind so, oder nur bei den Heap-Objekten (da sie ja auch mit new erstellt wurden).</p>
<p>2. Wie sieht denn so ein typischer Destruktor aus. Man möchte ja bspw. den Speicherplatz der zerstörten Variablen wieder freigeben. Wie mache ich das?</p>
<p>Danke!!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/303879/frage-zu-destruktor</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 05:37:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/303879.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 24 May 2012 13:34:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Destruktor on Thu, 24 May 2012 13:34:19 GMT]]></title><description><![CDATA[<p>Hey!</p>
<p>Ich hab mal zwei Fragen was Objekte betrifft.</p>
<p>1. Wie ihr ja sicher wisst, hat Java einen automatischen GarbageCollector, den man nicht beeinflussen kann. C++ hat das ja aber nicht, man kann mit &quot;delete&quot; Objekte zerstören.</p>
<p>Jetzt meine Frage: Ist das bei Objekten so, die auf dem Heap und dem Stack sind so, oder nur bei den Heap-Objekten (da sie ja auch mit new erstellt wurden).</p>
<p>2. Wie sieht denn so ein typischer Destruktor aus. Man möchte ja bspw. den Speicherplatz der zerstörten Variablen wieder freigeben. Wie mache ich das?</p>
<p>Danke!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2214912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2214912</guid><dc:creator><![CDATA[blub85]]></dc:creator><pubDate>Thu, 24 May 2012 13:34:19 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Destruktor on Thu, 24 May 2012 13:49:32 GMT]]></title><description><![CDATA[<p>Nur was du mit <code>new</code> anforderst musst du auch mit <code>delete</code> wieder freigeben. Alles andere passiert &quot;automatisch&quot;. Also verzichte weitestgehend auf <code>new</code> , damit du kein <code>delete</code> vergisst. Ansonsten hilft ein gutes Buch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2214920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2214920</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 24 May 2012 13:49:32 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Destruktor on Thu, 24 May 2012 13:51:59 GMT]]></title><description><![CDATA[<p>Dass würde also bedeuten, dass C++ bei Objekten, die auf dem Stack (also nicht mit new angelegt wurden) liegen, einen automatischen GarbageCollecor haben? Also ähnlich wie Java?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2214921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2214921</guid><dc:creator><![CDATA[blub85]]></dc:creator><pubDate>Thu, 24 May 2012 13:51:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Destruktor on Thu, 24 May 2012 13:54:03 GMT]]></title><description><![CDATA[<p>blub85 schrieb:</p>
<blockquote>
<p>1. Wie ihr ja sicher wisst, hat Java einen automatischen GarbageCollector, den man nicht beeinflussen kann. C++ hat das ja aber nicht, man kann mit &quot;delete&quot; Objekte zerstören.</p>
</blockquote>
<p>C++ hat etwas, was die C+'ler viel toller finden: Automatische Stackverwaltung. Du braucht new und delete fast nie. Und wenn, dann versteckst du sie in Klassen, die dann auf dem Stack liegen und so von der automatischen Verwaltung profitieren, siehe unten.</p>
<blockquote>
<p>Jetzt meine Frage: Ist das bei Objekten so, die auf dem Heap und dem Stack sind so, oder nur bei den Heap-Objekten (da sie ja auch mit new erstellt wurden).</p>
</blockquote>
<p>Mit delete kannst und musst du genau die Objekte zerstören, die du mit new erzeugt hast. delete ist zudem kein direkter Destruktoraufruf sondern gibt zudem auch noch den Speicher der mit new angefordert wurde wieder frei. Es ist möglich aber nur sehr sehr selten sinnvoll, einen Destruktor direkt aufzurufen, meistens im Zusammenhang mit einem placement new.</p>
<p>Wie oben schon gesagt, ist wahrscheinlich an deinem Design etwas falsch, wenn du diese Antwort wirklich brauchtest.</p>
<p>.</p>
<blockquote>
<p>2. Wie sieht denn so ein typischer Destruktor aus. Man möchte ja bspw. den Speicherplatz der zerstörten Variablen wieder freigeben. Wie mache ich das?</p>
</blockquote>
<p>Typischerweise schreibst du überhaupt gar keinen Destruktor. Der Compiler schreibt dann automatisch einen Destruktor der äquivalent zu dem Destruktor ist, den du mit einer leeren Destruktorfunktion erhalten hättest. Du musst auch im Destruktor nicht den Speicherplatz von den Membern freigeben. Die Destruktoren von Membern werden automatisch rekursiv allesamt aufgerufen, in umgekehrter Reihenfolge wie sie erzeugt wurden. Das kannst du auch überhaupt nicht verhindern, selbst wenn du es wolltest.</p>
<p>Der Fall, wo man einen nicht-leeren Destruktor hat ist, wenn die Klassen irgendwelche Arten von Ressourcen verwaltet, die wieder freigegeben werden müssen. Meistens sind das Variablen auf dem Heap, aber auch Socketverbindungen oder Dateihandles (aber keine fstreams oder vectoren oder ähnliches! Die machen das schon selber in ihrem Destruktor. Da, wie oben erklärt, sowieso deren Destruktor aufgerufen wird, musst du dich darum nicht mehr kümmern!). Dann werden diese im Destruktor explizit freigegeben.</p>
<p>Zwei Googlestichworte: RAII, Regel der großen Drei</p>
<p>Komm als jemand der von Java kommt bloß nicht auf die Idee, in C++ wie in Java zu programmieren. Faustregeln:<br />
- Alles auf dem Stack, außer man hat sehr gute Gründe dagegen.<br />
- new und delte sind verdächtig<br />
- new[] und delete[] sind falsch, das ist std::vector.<br />
- Das RAII möglichst in die untersten Glieder der Memberkette fortsetzen. Eine Klasse verwaltet nicht mehrere Pointer und macht auf diesen new und delete, sie benutzt stattdessen smartpointer die das jeder getrennt für sich machen. Sie hält keine Dateihandles die manuell geschlossen werden müssen, sie halt eine Klasse (z.B. fstream aus der Standardbibliothek), die das selber machen. Folglich sind nur die Destruktoren der Klassen in der untersten Ebene nicht-trivial.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2214923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2214923</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 24 May 2012 13:54:03 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Destruktor on Thu, 24 May 2012 14:47:16 GMT]]></title><description><![CDATA[<p>Okay, VIELEN VIELEN DANK!!! DU BIST MIR EINE SEHR GROSSE HILFE!</p>
<p>Ich hab das jetzt soweit verstanden. Jetzt eine Frage, die wahrscheinl. recht häufig kommt: Wann Sack und wann Heap?</p>
<p>Im Normalfall, so schreibst Du ja, solle man eher den Stack benutzen, ne?</p>
<p>D a n k e!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2214962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2214962</guid><dc:creator><![CDATA[blub85]]></dc:creator><pubDate>Thu, 24 May 2012 14:47:16 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Destruktor on Thu, 24 May 2012 14:55:24 GMT]]></title><description><![CDATA[<p>Nutze doch erstmal den Stack. Wenn du dann an eine Stelle kommst, an der du denkst, dass sich ein new nicht vermeiden lässt, fragste noch mal nach. <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/2214967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2214967</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 24 May 2012 14:55:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Destruktor on Thu, 24 May 2012 15:00:57 GMT]]></title><description><![CDATA[<p>Hehe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_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>
<p>Es ist aber so, dass ich bald ne Diplomprüfung in Informatik habe, bei der ich mich -zumindest theoretisch- mit C++ auskennen muss.</p>
<p>Vond aher meine Frage. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2214970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2214970</guid><dc:creator><![CDATA[blub85]]></dc:creator><pubDate>Thu, 24 May 2012 15:00:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Destruktor on Thu, 24 May 2012 15:12:20 GMT]]></title><description><![CDATA[<p>Ganz allgemein braucht man den Heap genau in zwei Fällen:<br />
- Die Größe des Datenobjekts steht zur Compilezeit nicht fest. Dies kann zum Beispiel sein, wenn von einer Benutzereingabe abhängt, wie viele Objekte erzeugt werden oder von welchem Typ sie genau sind. Besonders das erste Problem hat man sehr häufig, praktisch in jedem Programm.<br />
- Man hat technische Beschränkungen für die Stackgröße und die Objekte passen nicht drauf.</p>
<p>In beiden Fällen wird man aber seltenst new und delete selbstständig machen. Die C++ Standardbibliothek hat bereits alle wichtigen Fälle mit passenden Verwaltungsobjekten (im Prinzip meistens bloß Pointer mit Programmlogik dahinter) abgedeckt. Die Verwaltungsobjekte liegen dann auf dem Stack und werden dort automatisch abgeräumt wenn sie ihren Gültigkeitsbereich verlassen und räumen ihre Heapdaten dann mit auf. Für den seltenen Fall, dass die Standardbibliothek nicht bietet was man braucht, sollte man aber mindestens dieses bewährte Konzept benutzen und eigene Verwaltungsobjekte schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2214977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2214977</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 24 May 2012 15:12:20 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Destruktor on Thu, 24 May 2012 15:19:55 GMT]]></title><description><![CDATA[<p>Du hast Polymorphie vergessen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2214981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2214981</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 24 May 2012 15:19:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Destruktor on Thu, 24 May 2012 15:22:28 GMT]]></title><description><![CDATA[<p>Wo braucht man denn bei Polymorphie den Heap? <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/2214982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2214982</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 24 May 2012 15:22:28 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Destruktor on Thu, 24 May 2012 15:42:17 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Du hast Polymorphie vergessen.</p>
</blockquote>
<p>Doch, den Fall wo du für Polymorphie den Heap brauchst:</p>
<p>Seppj schrieb:</p>
<blockquote>
<p>oder von welchem Typ sie genau sind</p>
</blockquote>
<p>Bashar schrieb:</p>
<blockquote>
<p>Wo braucht man denn bei Polymorphie den Heap? <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>
</blockquote>
<p>Genau. Wenn du vorher schon weißt, welche und wie viele Objekte eines Typs du hast, dann kannst (und solltest) du sie auch auf dem Stack polymorph ansprechen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2214988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2214988</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 24 May 2012 15:42:17 GMT</pubDate></item></channel></rss>