<?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[Zeiger-Problem &#x2F; oder delete-Problem]]></title><description><![CDATA[<p>Hallo ich habe eine Klasse, die darauf ausgelegt ist Zeiger auf nachfolgende Elemente zu haben.</p>
<p>Im Destruktor wird delete für die Kinder aufgerufen.</p>
<pre><code class="language-cpp">class Node
{
    std::list&lt; Node* &gt; next;
    ~Node()
    {  
        foreach next
        { 
            delete next;
            erase from list(next);
        }
    }
    void addNode(Node* n)
    {
        next.push_back(n);
    }
}
</code></pre>
<p>was macht delete hier genau? nur den destruktor aufrufen oder auch speicher freigeben?</p>
<p>Was ist wenn das ganze folgendermaßen bedient würde:</p>
<pre><code class="language-cpp">int main()
{
    Node* root = new Node();
    Node y;
    root.add(&amp;y);
    delete root;
    return 0;
}
</code></pre>
<p>würde das Probleme machen?</p>
<p>Und wenn ja wie kann ich sichergehen dass von meiner Klasse nur Zeiger mittels new erstellt werden können?<br />
Privater Konstruktor und Erzeugerklasse?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262468/zeiger-problem-oder-delete-problem</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 15:59:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262468.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 06 Mar 2010 17:54:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger-Problem &#x2F; oder delete-Problem on Sat, 06 Mar 2010 17:54:54 GMT]]></title><description><![CDATA[<p>Hallo ich habe eine Klasse, die darauf ausgelegt ist Zeiger auf nachfolgende Elemente zu haben.</p>
<p>Im Destruktor wird delete für die Kinder aufgerufen.</p>
<pre><code class="language-cpp">class Node
{
    std::list&lt; Node* &gt; next;
    ~Node()
    {  
        foreach next
        { 
            delete next;
            erase from list(next);
        }
    }
    void addNode(Node* n)
    {
        next.push_back(n);
    }
}
</code></pre>
<p>was macht delete hier genau? nur den destruktor aufrufen oder auch speicher freigeben?</p>
<p>Was ist wenn das ganze folgendermaßen bedient würde:</p>
<pre><code class="language-cpp">int main()
{
    Node* root = new Node();
    Node y;
    root.add(&amp;y);
    delete root;
    return 0;
}
</code></pre>
<p>würde das Probleme machen?</p>
<p>Und wenn ja wie kann ich sichergehen dass von meiner Klasse nur Zeiger mittels new erstellt werden können?<br />
Privater Konstruktor und Erzeugerklasse?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865217</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Sat, 06 Mar 2010 17:54:54 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger-Problem &#x2F; oder delete-Problem on Sat, 06 Mar 2010 18:00:21 GMT]]></title><description><![CDATA[<blockquote>
<p>was macht delete hier genau? nur den destruktor aufrufen oder auch speicher freigeben?</p>
</blockquote>
<p>delete zerstört das Objekt. Und da wird der Destruktor aufgerufen, sowie der Speicher freigegeben.</p>
<p>Üblicherweise fügst du keine Knoten direkt ein, sondern übergibst einen Wert, oder was auch immer, welcher gespeichert werden soll. Und die Liste erzeugt dann den Knoten und fügt das übergebene Element dort an. Und gibt dann auch wieder den Speicher für den Knoten frei.</p>
<p>Und ja das, was du da hast gibt dir undefiniertes Verhalten. Wahrscheinlich kriegst du einen Laufzeitfehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865218</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 06 Mar 2010 18:00:21 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger-Problem &#x2F; oder delete-Problem on Sat, 06 Mar 2010 19:06:32 GMT]]></title><description><![CDATA[<p>mir ist durchaus klar, dass ich aufrufe wie</p>
<p>Node x nicht haben möchte sondern stets einen Aufruf von new haben möchte...</p>
<p>auf die Variante mit nur Werten übergeben möchte ich eigentlich verzichten , da ich intern evt Knoten verschieben können möchte.<br />
Gibt es eine bessere3 Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865230</guid><dc:creator><![CDATA[shisha]]></dc:creator><pubDate>Sat, 06 Mar 2010 19:06:32 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger-Problem &#x2F; oder delete-Problem on Sun, 07 Mar 2010 13:00:02 GMT]]></title><description><![CDATA[<p>shisha schrieb:</p>
<blockquote>
<p>auf die Variante mit nur Werten übergeben möchte ich eigentlich verzichten , da ich intern evt Knoten verschieben können möchte.<br />
Gibt es eine bessere3 Idee?</p>
</blockquote>
<p>Das kannst du auch, wenn du nur Werte übergibst.</p>
<p>Ich versteh eh nicht ganz, was das ganze bei dir soll. Du verwaltest eine Liste von Knotenin einer std::list?! - Macht imo wenig Sinn.</p>
<p>Aber wenn du das wirklich so in etwa brauchst kannst du schon den Konstruktor für Node private machen und dann eine statische Erzeuger Methode anbieten.</p>
<pre><code class="language-cpp">class Node
{
//...
  static Node* create () { return new Node; }
private:
  Node (){/*whatever*/}
}
</code></pre>
<p>Da musst du aber aufpassen, dass du den Speicher für frei gibst, denn das ist jetzt die Aufgabe von Node, da der Aufrufer das Objekt nicht freigeben sollen muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865441</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 07 Mar 2010 13:00:02 GMT</pubDate></item></channel></rss>