<?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[Ungewollter Destruktoraufruf, warum?]]></title><description><![CDATA[<p>Hallo Community,<br />
Ich habe heute ein kleines Testprogramm geschrieben, bei dem ich eine verkettete Liste implementiere und bin dabei auf was merkwürdiges gestoßen, was ich mir nicht erklären kann. Der Code sieht (auf das Wesentliche reduziert) so aus:</p>
<pre><code>class Liste
{
private:
  Liste* next;
public:
  Liste(Liste* Next = 0) : next(Next) {}
  ~Liste() {delete next;}
  Liste* Next() {return next;}
  Liste operator&lt;&lt;(Liste* secList) {
    //Die übergebene Liste an das letzte Element anhängen
    Liste* tempList = 0;
    for(tempList = this; tempList-&gt;Next() != 0; tempList = tempList-&gt;Next());
    tempList-&gt;next = secList;
    return *this;
  }
};

void main()
{
  Liste* myList = new Liste();
  *myList &lt;&lt; new Liste() &lt;&lt; new Liste() &lt;&lt; new Liste();
}
</code></pre>
<p>Wenn man den Code ausführt erhält man eine Exception. Ich habe das ganze mal debuggt und herausgefunden, dass nachdem myList durch die mit</p>
<pre><code>new Liste()
</code></pre>
<p>erzeugten Listen erweitert wurde, für alle Listenelemente, die eben an myList angehängt wurden der Destruktor aufgerufen wird.</p>
<p>Da das erste Element bereits alle nachfolgenen im Desktruktor löscht, wird eine Exception geworden, sobald das nächste Element mit delete gelöscht werden soll.<br />
Soweit ist alles klar...</p>
<p>Aber warum macht C++ sowas? Wieso wird auf die im Heap allokierten Listen ein delete aufgerufen? <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>Wenn ich den operator&lt;&lt; so modifiziere, dass er eine Referenz zurückgibt, funktioniert alles wunderbar</p>
<pre><code>Liste&amp; operator&lt;&lt;(Liste* secList) {
...
</code></pre>
<p>Aber warum?</p>
<p>Thx</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/280709/ungewollter-destruktoraufruf-warum</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 00:21:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/280709.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 19 Jan 2011 22:46:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ungewollter Destruktoraufruf, warum? on Wed, 19 Jan 2011 22:46:07 GMT]]></title><description><![CDATA[<p>Hallo Community,<br />
Ich habe heute ein kleines Testprogramm geschrieben, bei dem ich eine verkettete Liste implementiere und bin dabei auf was merkwürdiges gestoßen, was ich mir nicht erklären kann. Der Code sieht (auf das Wesentliche reduziert) so aus:</p>
<pre><code>class Liste
{
private:
  Liste* next;
public:
  Liste(Liste* Next = 0) : next(Next) {}
  ~Liste() {delete next;}
  Liste* Next() {return next;}
  Liste operator&lt;&lt;(Liste* secList) {
    //Die übergebene Liste an das letzte Element anhängen
    Liste* tempList = 0;
    for(tempList = this; tempList-&gt;Next() != 0; tempList = tempList-&gt;Next());
    tempList-&gt;next = secList;
    return *this;
  }
};

void main()
{
  Liste* myList = new Liste();
  *myList &lt;&lt; new Liste() &lt;&lt; new Liste() &lt;&lt; new Liste();
}
</code></pre>
<p>Wenn man den Code ausführt erhält man eine Exception. Ich habe das ganze mal debuggt und herausgefunden, dass nachdem myList durch die mit</p>
<pre><code>new Liste()
</code></pre>
<p>erzeugten Listen erweitert wurde, für alle Listenelemente, die eben an myList angehängt wurden der Destruktor aufgerufen wird.</p>
<p>Da das erste Element bereits alle nachfolgenen im Desktruktor löscht, wird eine Exception geworden, sobald das nächste Element mit delete gelöscht werden soll.<br />
Soweit ist alles klar...</p>
<p>Aber warum macht C++ sowas? Wieso wird auf die im Heap allokierten Listen ein delete aufgerufen? <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>Wenn ich den operator&lt;&lt; so modifiziere, dass er eine Referenz zurückgibt, funktioniert alles wunderbar</p>
<pre><code>Liste&amp; operator&lt;&lt;(Liste* secList) {
...
</code></pre>
<p>Aber warum?</p>
<p>Thx</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009025</guid><dc:creator><![CDATA[Soley]]></dc:creator><pubDate>Wed, 19 Jan 2011 22:46:07 GMT</pubDate></item><item><title><![CDATA[Reply to Ungewollter Destruktoraufruf, warum? on Wed, 19 Jan 2011 22:54:27 GMT]]></title><description><![CDATA[<p>Soley schrieb:</p>
<blockquote>
<p>Wenn ich den operator&lt;&lt; so modifiziere, dass er eine Referenz zurückgibt, funktioniert alles wunderbar</p>
</blockquote>
<p>Und was ist der Unterschied? Wenn du per value zurückgibst, wird eine Kopie von *this erstellt. Was passiert mit dieser Kopie im weiteren Verlauf?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009028</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 19 Jan 2011 22:54:27 GMT</pubDate></item><item><title><![CDATA[Reply to Ungewollter Destruktoraufruf, warum? on Wed, 19 Jan 2011 23:00:18 GMT]]></title><description><![CDATA[<p>Danach wird auf diese Kopie wieder der &lt;&lt;operator aufgerufen und ein weiteres Element anghängt usw.<br />
Wird diese Kopie vielleicht automatisch gelöscht, weil sie nach dem Aufruf von &lt;&lt; ihre Gültigkeit verliert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009032</guid><dc:creator><![CDATA[Soley]]></dc:creator><pubDate>Wed, 19 Jan 2011 23:00:18 GMT</pubDate></item><item><title><![CDATA[Reply to Ungewollter Destruktoraufruf, warum? on Wed, 19 Jan 2011 23:17:59 GMT]]></title><description><![CDATA[<p>So in etwa. Versuch, die Lebenszeit mal genau zu verfolgen. Das Objekt wird beim Verlassen des innersten op&lt;&lt;-Aufrufs angelegt. Im aufrufenden Kontext gibst du diesem Objekt keinen Namen, es ist ein sogenannter rvalue. Nur ein Zeiger darauf existiert, nämlich als Parameter für den nächsten op&lt;&lt;-Aufruf. Nach dem Durchlaufen dieses op&lt;&lt;-Aufrufs ist das Objekt futsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009040</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 19 Jan 2011 23:17:59 GMT</pubDate></item><item><title><![CDATA[Reply to Ungewollter Destruktoraufruf, warum? on Wed, 19 Jan 2011 23:18:37 GMT]]></title><description><![CDATA[<p>Dann ergibt das alles natürlich einen Sinn.<br />
Vielen Dank für die Erklärung <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009042</guid><dc:creator><![CDATA[Soley]]></dc:creator><pubDate>Wed, 19 Jan 2011 23:18:37 GMT</pubDate></item><item><title><![CDATA[Reply to Ungewollter Destruktoraufruf, warum? on Thu, 20 Jan 2011 19:12:43 GMT]]></title><description><![CDATA[<p>Mein Tipp: Einen Copy-Konstruktor und einen Zuweisungsoperator definieren, der alle Sub-Listen kopiert und die Klasse zu Listenelement umbenennen und eine Klasse Liste definieren, die die Elemente verwaltet (falls du das nicht schon gemacht hast).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009477</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Thu, 20 Jan 2011 19:12:43 GMT</pubDate></item><item><title><![CDATA[Reply to Ungewollter Destruktoraufruf, warum? on Fri, 21 Jan 2011 19:54:38 GMT]]></title><description><![CDATA[<p>Die Liste ist einfach grundsätzlich falsch. Eine List besteht aus Knoten, die eine eigene Klasse darstellen. Die Liste selbst bietet nur die Zugriffe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2009948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009948</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Fri, 21 Jan 2011 19:54:38 GMT</pubDate></item><item><title><![CDATA[Reply to Ungewollter Destruktoraufruf, warum? on Fri, 21 Jan 2011 22:06:08 GMT]]></title><description><![CDATA[<p>Das sollte auch kein achsotollgroßes Projekt werden. Ich hab halt nur ein bissl rumgetestet und bin dann auf dieses Problem gestoßen, welches mich zum Grübeln gebracht hat.</p>
<blockquote>
<p>Der Code sieht (auf das Wesentliche reduziert) so aus:</p>
</blockquote>
<p>Die eigentliche Klasse besteht auch aus ein bisschen mehr, nur habe ich sie halt auf den funktionalen Kern reduziert, damit nicht diejenigen, die mir helfen könnten durch zig Zeilen code abgeschreckt werden <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/2009992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2009992</guid><dc:creator><![CDATA[Soley]]></dc:creator><pubDate>Fri, 21 Jan 2011 22:06:08 GMT</pubDate></item></channel></rss>