<?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[Destruktor und Heap?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Klasse die etwa so aussieht:</p>
<pre><code class="language-cpp">class Test
{
  public:
    Test()
    {
        this-&gt;testVar = new char[200];
    };
    virtual blub(){};

  private:
    char* testVar;
};
</code></pre>
<p>Mir stellen sich jetzt 2 Fragen:<br />
1. Muss ich im Destruktor delete <em><strong>this-&gt;testVar</strong></em> aufrufen?<br />
2. Wie sieht das mit dem virtuellem Destruktor aus? Wie wird da die auf dem Heap erzeugter char[200] behandelt?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/251545/destruktor-und-heap</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 11:11:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/251545.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 Oct 2009 18:58:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Destruktor und Heap? on Tue, 06 Oct 2009 18:58:26 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Klasse die etwa so aussieht:</p>
<pre><code class="language-cpp">class Test
{
  public:
    Test()
    {
        this-&gt;testVar = new char[200];
    };
    virtual blub(){};

  private:
    char* testVar;
};
</code></pre>
<p>Mir stellen sich jetzt 2 Fragen:<br />
1. Muss ich im Destruktor delete <em><strong>this-&gt;testVar</strong></em> aufrufen?<br />
2. Wie sieht das mit dem virtuellem Destruktor aus? Wie wird da die auf dem Heap erzeugter char[200] behandelt?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788884</guid><dc:creator><![CDATA[psih]]></dc:creator><pubDate>Tue, 06 Oct 2009 18:58:26 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und Heap? on Tue, 06 Oct 2009 19:01:22 GMT]]></title><description><![CDATA[<p>psih schrieb:</p>
<blockquote>
<p>1. Muss ich im Destruktor delete <em><strong>this-&gt;testVar</strong></em> aufrufen?</p>
</blockquote>
<p>ja, es sei denn, du weißt, dass du es nicht tun musst. Allerdings mit dem richtigen Operator:</p>
<pre><code>delete [b][][/b] this-&gt;testVar
</code></pre>
<p>psih schrieb:</p>
<blockquote>
<p>Wie sieht das mit dem virtuellem Destruktor aus? Wie wird da die auf dem Heap erzeugter char[200] behandelt?</p>
</blockquote>
<p>nicht anders.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788885</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 06 Oct 2009 19:01:22 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und Heap? on Tue, 06 Oct 2009 19:04:08 GMT]]></title><description><![CDATA[<p>1.) Der den Speicher verwaltet, muss ihn freigeben (ownership etc.). Kurz: Ja.<br />
2.) Ist der Destruktor virtuell, so wird von C++ garantiert, das jeder gemaess der Klassenhierarchie abgearbeitet wird (wie beim Auspacken von Geschenken).</p>
<p>Zu 1.): Genauer: kommt drauf an ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788888</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 06 Oct 2009 19:04:08 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und Heap? on Tue, 06 Oct 2009 19:07:02 GMT]]></title><description><![CDATA[<p>Also wird der virtuelle Destruktor garnicht überschrieben?</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788893</guid><dc:creator><![CDATA[psih]]></dc:creator><pubDate>Tue, 06 Oct 2009 19:07:02 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und Heap? on Tue, 06 Oct 2009 19:10:21 GMT]]></title><description><![CDATA[<p>Ja, du solltest den Speicher wieder freigeben. Ausserdem wäre es gut, du würdest Kopierkonstruktor und Zuweisungsoperator implementieren (oder verbieten), sonst hast du schnell Probleme.</p>
<pre><code class="language-cpp">class Test
{
    public:
        // Konstruktor: Grundsätzlich Initialisierungsliste verwenden
        Test()
        : testVar(new char[200]) // &lt;- das hier, Member per Komma trennen
        {
        } // kein Semikolon nötig hier

        // Destruktor: Speicher freigeben
        ~Test()
        {
            delete[] testVar;
        }

        // Kopierkonstruktor: Neuen Speicher anfordern und Inhalt kopieren
        Test(const Test&amp; Origin)
        : testVar(new char[200])
        {
            std::copy(Origin.testVar, Origin.testVar+200, testVar);
        }

        // Zuweisungsoperator: Alten Speicher freigeben, neuen anfordern, kopieren
        Test&amp; operator= (const Test&amp; Origin)
        {
            delete[] testVar;
            testVar = new char[200];
            std::copy(Origin.testVar, Origin.testVar+200, testVar);
            return *this;
        }

    private:
        char* testVar;
};
</code></pre>
<p>Ich lege dir nahe, etwas Literatur darüber zu lesen, das ist nämlich sehr wichtig. Am Rande sei auch noch das Copy&amp;Swap-Idiom erwähnt, um sicherer zuzuweisen.</p>
<p>Im Normalfall solltest du eher auf die STL-Container und <code>std::string</code> zurückgreifen, als Speicherverwaltung selbst handzuhaben. Im Magazin dieses Forums gibt es ein paar Artikel über die STL, schau dir die vielleicht mal an. Diese ist nämlich ebenfalls ein sehr elementarer Bestandteil von C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788896</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 06 Oct 2009 19:10:21 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und Heap? on Tue, 06 Oct 2009 19:18:54 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Test&amp; operator= (const Test&amp; Origin)
        {
            delete[] testVar;
            testVar = new char[200];
            std::copy(Origin.testVar, Origin.testVar+200, testVar);
        }
</code></pre>
</blockquote>
<p>so schon mal nicht.</p>
<pre><code class="language-cpp">Test&amp; operator= (const Test&amp; Origin)
        {
            char* p = new char[200];
            std::copy(Origin.testVar, Origin.testVar+200, p);

            delete[] testVar;
            testVar = p;
            return *this;
        }
</code></pre>
<p>Befindet sich ein delete am Anfang der Funktion, ist in 99% der Fälle ein Fehler drin: es ist einerseits nicht exception-sicher und zudem klappt hier auch die Selbstzuweisung nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788898</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 06 Oct 2009 19:18:54 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und Heap? on Tue, 06 Oct 2009 19:16:10 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>so schon mal nicht.</p>
</blockquote>
<p>Was meinst du? Copy&amp;Swap habe ich erwähnt, das fehlende <code>return *this;</code> war ein Flüchtigkeitsfehler, der auch schon behoben ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788902</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 06 Oct 2009 19:16:10 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und Heap? on Tue, 06 Oct 2009 19:19:37 GMT]]></title><description><![CDATA[<p>Ich würde hier sagen, dass du leicht eine höhere Exceptionsicherheit geben kannst, und darum hätte ich da entweder gleich Copy/Swap implementiert oder es als Kommentar da reingeschrieben, als Aufgabe für den TO. <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>
<p>EDIT:<br />
Weil es halt so verlockend ist etwas zu kopieren, dass läuft, ohne zu überlegen..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788903</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 06 Oct 2009 19:19:37 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und Heap? on Tue, 06 Oct 2009 19:27:24 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Befindet sich ein delete am Anfang der Funktion, ist in 99% der Fälle ein Fehler drin: es ist einerseits nicht exception-sicher und zudem klappt hier auch die Selbstzuweisung nicht.</p>
</blockquote>
<p>Exceptionsicherheit bei <code>char</code> ? Ok, <code>std::bad_alloc</code> . Aber angesichts der Tatsache, dass 1. psih wohl schon mit dem normalen Code viel zu lernen hat, 2. ich auf Copy&amp;Swap hingewiesen habe und 3. <code>bad_alloc</code> bei einer Anforderung von 200 <code>char</code> s wohl eher nicht auftritt (Selbstzuweisung ist auch recht selten), habe ich es halt <em>einfach</em> gelöst. Gut, wäre besser gewesen, es gleich richtig zu machen. Ich wollte psih halt nicht überfordern. Bin ich deswegen ein schlechter Mensch? <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>
<p>Bevor man sich um Exceptionsicherheit und ähnliche Dinge kümmert, sollte man meiner Ansicht nach die Grundlagen - Kopiersemantik, Speicherverwaltung und solche Sachen - verstanden haben. Ok, das mit der Selbstzuweisung kann wirklich blöd laufen. Hab ich zuerst gar nicht mehr dran gedacht, da ich eigentlich immer Copy&amp;Swap verwende... Sorry.</p>
<p>drakon schrieb:</p>
<blockquote>
<p>Ich würde hier sagen, dass du leicht eine höhere Exceptionsicherheit geben kannst, und darum hätte ich da entweder gleich Copy/Swap implementiert oder es als Kommentar da reingeschrieben, als Aufgabe für den TO. <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>
</blockquote>
<p>Steht doch extra da, weil ich solche Antworten befürchtet habe! :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788907</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 06 Oct 2009 19:27:24 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und Heap? on Tue, 06 Oct 2009 19:43:16 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Ich würde hier sagen, dass du leicht eine höhere Exceptionsicherheit geben kannst, und darum hätte ich da entweder gleich Copy/Swap implementiert oder es als Kommentar da reingeschrieben, als Aufgabe für den TO. <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>
</blockquote>
<p>Steht doch extra da, weil ich solche Antworten befürchtet habe! :p</p>
</blockquote>
<p>Jup. Das habe ich schon gesehen. Aber ich hätte halt einfach mal eben Copy/Swap gemacht, weil das halt doch recht intuitiv ist und er dann gar nicht auf die Idee kommt im Zuweisungsoperator sonst irgendwelche krumme Sachen zu drehen. <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>
<p>Ich find halt, dass dieses Idiom vor allem für Anfänger doch recht gelegen kommt, weil er dann merkt, dass er sich da überhaupt keine speziellen Gedanken machen muss, sondern eben ganz einfach dem Schema F folgen und das implementieren (auch für andere Klassen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788912</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 06 Oct 2009 19:43:16 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und Heap? on Tue, 06 Oct 2009 19:50:05 GMT]]></title><description><![CDATA[<p>Hm ja, eigentlich hast du schon Recht. Nächstes Mal versuche ich vielleicht besser, gleich eine gute Lösung zu bringen.</p>
<p>Naja, dann wird es eben wieder andere Leute geben, die mich des Overengeneerings beschuldigen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1788914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788914</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 06 Oct 2009 19:50:05 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und Heap? on Tue, 06 Oct 2009 19:56:35 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Naja, dann wird es eben wieder andere Leute geben, die mich des Overengeneerings beschuldigen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
</blockquote>
<p>Darum hätte ich mich mit einem schlichten:</p>
<pre><code class="language-cpp">Test&amp; operator= (const Test&amp; Origin)
        {
          //copy/swap
        }
</code></pre>
<p>begnügt. <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/1788917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1788917</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 06 Oct 2009 19:56:35 GMT</pubDate></item></channel></rss>