<?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 this Zeiger]]></title><description><![CDATA[<p>Ich grüße Euch!<br />
Ich habda ein kleines Problem ich möchte gerne den this Zeiger mit dem Destruktor kombinieren z.b. so</p>
<pre><code class="language-cpp">this-&gt;~Bild();
</code></pre>
<p>ich kriege beim debuggen keinen Fehler aber beim compilieren stürtzt das Programm ab wieso? Vielleicht könnt ihr mir da weiter helfen! <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/topic/228857/destruktor-und-this-zeiger</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 09:14:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/228857.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 03 Dec 2008 16:19:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Destruktor und this Zeiger on Wed, 03 Dec 2008 16:19:09 GMT]]></title><description><![CDATA[<p>Ich grüße Euch!<br />
Ich habda ein kleines Problem ich möchte gerne den this Zeiger mit dem Destruktor kombinieren z.b. so</p>
<pre><code class="language-cpp">this-&gt;~Bild();
</code></pre>
<p>ich kriege beim debuggen keinen Fehler aber beim compilieren stürtzt das Programm ab wieso? Vielleicht könnt ihr mir da weiter helfen! <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/1625014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625014</guid><dc:creator><![CDATA[BrainCoder]]></dc:creator><pubDate>Wed, 03 Dec 2008 16:19:09 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Wed, 03 Dec 2008 16:25:35 GMT]]></title><description><![CDATA[<p>Was möchtest du damit erreichen? Den Destruktor ruft man eigentlich nie explizit auf (es gibt Ausnahmen, die tun hier aber nichts zur Sache).<br />
Wenn das Objekt sich selbst löschen soll, dann reicht ein einfaches</p>
<pre><code class="language-cpp">delete this;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1625017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625017</guid><dc:creator><![CDATA[dooooomi]]></dc:creator><pubDate>Wed, 03 Dec 2008 16:25:35 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Wed, 03 Dec 2008 18:50:01 GMT]]></title><description><![CDATA[<p>delete this; ist aber unschön (Kann (IST eigentlich) undefiniertes Verhalten sein).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625075</guid><dc:creator><![CDATA[Schöner]]></dc:creator><pubDate>Wed, 03 Dec 2008 18:50:01 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Wed, 03 Dec 2008 20:35:55 GMT]]></title><description><![CDATA[<p>Schöner schrieb:</p>
<blockquote>
<p>delete this; ist aber unschön (Kann (IST eigentlich) undefiniertes Verhalten sein).</p>
</blockquote>
<p>Nein. `delete this` ist wohldefiniert. Man muss nur aufpassen, dass man danach nichts dummes macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625120</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Wed, 03 Dec 2008 20:35:55 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Thu, 04 Dec 2008 07:39:50 GMT]]></title><description><![CDATA[<p>this-&gt;~T() ist AFAIK auch wohldefiniert, wenn man es richtig anwendet (was aber nicht unbedingt einfach ist).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625236</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 04 Dec 2008 07:39:50 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Thu, 04 Dec 2008 07:45:21 GMT]]></title><description><![CDATA[<p>Zusätzlich zu dem, was Konrad und hustbaer sagten, bleibt evtl. noch anzumerken, dass delete this und this-&gt;~T() nicht das gleiche sind. Das eine destruiert und löscht, das andere destruiert nur.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625239</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 04 Dec 2008 07:45:21 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Thu, 04 Dec 2008 08:02:05 GMT]]></title><description><![CDATA[<p>Zurück zur Frage:</p>
<p>BrainCoder schrieb:</p>
<blockquote>
<pre><code class="language-cpp">this-&gt;~Bild();
</code></pre>
<p>ich kriege beim debuggen keinen Fehler aber beim compilieren stürtzt das Programm ab wieso? Vielleicht könnt ihr mir da weiter helfen! <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>Wie benutzt Du denn das Objekt? Wenn Du das bei einem normalen Objekt mit automatischer Lebensdauer machst (also in einer Funktion), dann wird am Ende des Blocks *nochmal* implizit der Destruktor aufgerufen und das ist wahrscheinlich nicht das, was Du willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625243</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625243</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 04 Dec 2008 08:02:05 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Thu, 04 Dec 2008 08:12:53 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>this-&gt;~T() ist AFAIK auch wohldefiniert, wenn man es richtig anwendet (was aber nicht unbedingt einfach ist).</p>
</blockquote>
<p>hmmmm - sowas kann ja eigentlich nur innerhalb einer Memberfunktion passieren ... kann man da dann ein placement-new (auf this) machen?<br />
Gibt's überhaupt einen Fall, in dem man explizit den Dtor aufruft und danach NICHT placement-new ?</p>
<p>... und wie kann man innerhalb einer Memberfunktion das Objekt löschen (&quot;delete this&quot;) ? Ich dachte immer, dabei würde u.a. auch die vtable abgeräumt - wie soll's mit der aufrufenden Funktion &quot;weitergehen&quot; ? Einen öffentlichen Dtor darf man dann auch nicht mehr haben, oder ?...</p>
<p>Fragen über Fragen.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625255</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 04 Dec 2008 08:12:53 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Thu, 04 Dec 2008 08:17:30 GMT]]></title><description><![CDATA[<p>Grundsätzlich sollte man vielleicht ein paar Rahmenbedingungen festlegen:</p>
<p>Im Regelfall sollte man weder &quot;delete this&quot; noch den Destruktor eines Objektes aufrufen.</p>
<p>Wenn man es dennoch tut, muss man aufpassen wie das Objekt außerhalb verwendet wird. falls man es mit new anlegt, und auch mit delete freigibt, ist ein weiterer Aufruf des Destruktors wohl kaum sinnvoll. Und ein &quot;delete this&quot; für ein auf den Stack angelegtes Objekt ist genauso problematisch.</p>
<p>In der Regel also Finger weg, und nur einsetzen wenn man wirklich weiß was man tut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625258</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 04 Dec 2008 08:17:30 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Thu, 04 Dec 2008 08:22:45 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>this-&gt;~T() ist AFAIK auch wohldefiniert, wenn man es richtig anwendet (was aber nicht unbedingt einfach ist).</p>
</blockquote>
<p>hmmmm - sowas kann ja eigentlich nur innerhalb einer Memberfunktion passieren ... kann man da dann ein placement-new (auf this) machen?<br />
Gibt's überhaupt einen Fall, in dem man explizit den Dtor aufruft und danach NICHT placement-new ?</p>
</blockquote>
<p>Nö, eigentlich nicht. Es ist eben hauptsächlich in Containerklassen (lies: deren Allokatoren) sinnvoll.</p>
<blockquote>
<p>... und wie kann man innerhalb einer Memberfunktion das Objekt löschen (&quot;delete this&quot;) ? Ich dachte immer, dabei würde u.a. auch die vtable abgeräumt - wie soll's mit der aufrufenden Funktion &quot;weitergehen&quot; ?</p>
</blockquote>
<p>Klar, die vtable wird aufgeräumt, aber das ist ja egal. Die aktuelle Funktion wird ganz normal weiter ausgeführt und solange Du danach nicht auf Datenmembers zugreifst oder virtuelle Funktionen aufrufst, ist alles in Butter (Parashift <a href="http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.15" rel="nofollow">behauptet</a>, man dürfe überhaupt keine Funktionen mehr aufrufen, das glaube ich aber nicht ohne weiteres).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625262</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 04 Dec 2008 08:22:45 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Thu, 04 Dec 2008 09:11:31 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>...Klar, die vtable wird aufgeräumt, aber das ist ja egal. Die aktuelle Funktion wird ganz normal weiter ausgeführt und solange Du danach nicht auf Datenmembers zugreifst oder virtuelle Funktionen aufrufst, ist alles in Butter...</p>
</blockquote>
<p>hmmm um den Dtor muss man sich natürlich gesondert kümmern (darf gar nicht mehr aufrufbar sein oder { non-virtual und &quot;stateless wiederholbar&quot; }....</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625287</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 04 Dec 2008 09:11:31 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Thu, 04 Dec 2008 11:34:23 GMT]]></title><description><![CDATA[<p>SORRY.<br />
Ich meinte eigentlich nicht this-&gt;~T() sondern nur p-&gt;~T().</p>
<p>this-&gt;~T() ist zwar auch wohldefiniert, nur ist wirklich die Frage wo man es sinnvoll einsetzen könnte.</p>
<p>Eine Sache die mir einfällt wäre wenn man den Platz für ein Singleton statisch reservieren will, das Aufräumen der Instanz allerdings über Intrusive-Reference-Counting steuern. Zugegebenermassen sehr weit hergeholt, aber in dem Fall könnte es einem passieren dass man irgendwo this-&gt;~T() schreibt, und es Sinn macht (und auch &quot;OK&quot; ist).</p>
<p>---</p>
<blockquote>
<p>kann man da dann ein placement-new (auf this) machen?</p>
</blockquote>
<p>Nope, da man auf &quot;this&quot; danach nichtmehr zugreifen sollte, zumindest so wie ich den Standard verstehe. Man könnte sich den &quot;this&quot; Zeiger allerdings vorher in einen void* kopieren, und diesen void* dann danach für placement-new verwenden. Kann aber auch sein ich bin in der Auslegung des Standards da etwas zu paranoid, und man darf es auch ohne diesen Umweg machen. (&quot;Können&quot; tut man es sicher, kenne keinen Compiler der da Probleme machen würde)</p>
<blockquote>
<p>Gibt's überhaupt einen Fall, in dem man explizit den Dtor aufruft und danach NICHT placement-new ?</p>
</blockquote>
<p>Klar, z.B. in Containern, hat ja der Konrad schon erwähnt. Nämlich z.B. wenn ein std::vector sich gerade &quot;resized&quot;, und während des Umkopierens eine Exception fliegt. Dann muss man die bereits konstruierten Objekte wieder &quot;zurückbasteln&quot; (also zerstören). Danach hat man wieder &quot;rohen Speicher&quot;, den gibt man dann frei, und alles ist wieder gut <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/1625369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625369</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 04 Dec 2008 11:34:23 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Thu, 04 Dec 2008 18:03:24 GMT]]></title><description><![CDATA[<p>Lustig, mir ist heute auf Arbeit aufgefallen, dass ich das in meinem Code verwende. Hatte ich ganz vergessen.</p>
<p>Und zwar brauchen meine Objekte quasi eine `reset`-Methode und das ganze soll außerdem recht effizient laufen bitteschön. Die Methode ist folgendermaßen implementiert:</p>
<pre><code class="language-cpp">struct T {
    …
    void reset() {
        this-&gt;~T();
        new (this) T();
    }
};
</code></pre>
<p>Das könnte man vielleicht sogar zum Idiom erheben (CRTP, anyone?) – zum Glück braucht man solche Reset-Methoden aber nicht sehr häufig, daher kann man's sich eigentlich auch schenken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625580</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 04 Dec 2008 18:03:24 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Thu, 04 Dec 2008 23:39:28 GMT]]></title><description><![CDATA[<p>Zum Glück kann man, wenn man Einfluss auf die Klassen hat die solche Funktionen brauchen, das auch anders implementieren <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/1625721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625721</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 04 Dec 2008 23:39:28 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Fri, 05 Dec 2008 07:42:45 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Zum Glück kann man, wenn man Einfluss auf die Klassen hat die solche Funktionen brauchen, das auch anders implementieren <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>Und zwar wie? Beachte, dass ich kein Fan von diese `init`-Methoden bin – d.h. ich will im Konstruktor keine andere Methode aufrufen sondern nur Members initialisieren. Und Codeduplikation will ich natürlich auch vermeiden.</p>
<p>Um das ganze interessanter zu machen, können wir auch annehmen, dass einige Members `const` sind. Wobei das dann natürlich schon hart an die Grenze des guten Geschmacks geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625772</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 05 Dec 2008 07:42:45 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Fri, 05 Dec 2008 16:31:12 GMT]]></title><description><![CDATA[<p>Das könnte man doch mit einem Standardkonstruktor und selbst definierten swap lösen oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625891</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 05 Dec 2008 16:31:12 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Fri, 05 Dec 2008 18:23:45 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Das könnte man doch mit einem Standardkonstruktor und selbst definierten swap lösen oder?</p>
</blockquote>
<p>Stimmt. Aber: selbstdefiniertes Swap = Codeduplikation. Aber zugegeben, das ist nicht mehr stichhaltig, denn dieselbe Codeduplikation hat man, sobald man sich einen Kopierkonstruktor schreibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625943</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 05 Dec 2008 18:23:45 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Fri, 05 Dec 2008 19:25:57 GMT]]></title><description><![CDATA[<p><strong>@ Konrad Rudolph:</strong><br />
Wegen der &quot;Effizienz&quot;: Wenn du eine <code>Reset()</code> -Methode schreibst, führst du wahrscheinlich einige Zuweisungen bzw. Allokationen und Löschungen in der Klasse durch. Meinst du nicht, das geht schneller als das komplette Zerstören und Neu-Konstruieren des Objekts?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625972</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 05 Dec 2008 19:25:57 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Fri, 05 Dec 2008 19:32:33 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p><strong>@ Konrad Rudolph:</strong><br />
Wegen der &quot;Effizienz&quot;: Wenn du eine <code>Reset()</code> -Methode schreibst, führst du wahrscheinlich einige Zuweisungen bzw. Allokationen und Löschungen in der Klasse durch. Meinst du nicht, das geht schneller als das komplette Zerstören und Neu-Konstruieren des Objekts?</p>
</blockquote>
<p>Wo ist der Unterschied? Selbst bei Non-PODs sollte es keinen geben, meine Klasse enthält aber sowieso nur PODs. Also, effizienter bekommt man meinen Code glaube ich wirklich nicht mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1625975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1625975</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Fri, 05 Dec 2008 19:32:33 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Sat, 06 Dec 2008 20:58:40 GMT]]></title><description><![CDATA[<p>An dieser Stelle noch eine Frage.</p>
<p>Folgendes Code-Stück sei gegeben:</p>
<p>Methode von Klasse1:</p>
<pre><code class="language-cpp">void Klasse1::funktion1() {
  ..
  zeiger_auf_Klasse2_objekt-&gt;funktion2(this);
}
</code></pre>
<p>Methode von Klasse2:</p>
<pre><code class="language-cpp">void Klasse2::funktion2(Klasse1* k1) {
  ..
  delete k1;
}
</code></pre>
<p>Das sollte doch ohne Probleme funktionieren oder?<br />
(vorrausgesetzt Klasse1 wurde mit new erzeugt und es wird nicht mehr darauf zugegriffen nachdem funktion1 aufgerufen wurde)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1626295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1626295</guid><dc:creator><![CDATA[xorm]]></dc:creator><pubDate>Sat, 06 Dec 2008 20:58:40 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Sun, 07 Dec 2008 00:07:39 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Wo ist der Unterschied? Selbst bei Non-PODs sollte es keinen geben, meine Klasse enthält aber sowieso nur PODs. Also, effizienter bekommt man meinen Code glaube ich wirklich nicht mehr.</p>
</blockquote>
<p>Ich bin mir da nicht sicher. Wird bei Klassen im Konstruktor nie mehr gemacht als nur Member initialisiert? Oder ist das nur bei polymorphen der Fall?</p>
<p>xorm schrieb:</p>
<blockquote>
<p>Das sollte doch ohne Probleme funktionieren oder?<br />
(vorrausgesetzt Klasse1 wurde mit new erzeugt und es wird nicht mehr darauf zugegriffen nachdem funktion1 aufgerufen wurde)</p>
</blockquote>
<p>Nein - das Codestück ist kritisch, weil die Funktion der Klasse selbst noch am Laufen ist, während das Objekt schon zerstört wurde. Zudem wird nachher normalerweise nochmals der Destruktor der (jetzt toten) Klasse aufgerufen.</p>
<p>Du kannst dir also merken: Objekte können sich nicht selber zerstören. Als &quot;selbst&quot; gilt auch, wenn eine Methode eine andere Funktion aufruft, die das Objekt destruiert. Sowie auch Funktionen, die sich gegenseitig aufrufen, rekursiv sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1626346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1626346</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 07 Dec 2008 00:07:39 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Sun, 07 Dec 2008 03:07:48 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>xorm schrieb:</p>
<blockquote>
<p>Das sollte doch ohne Probleme funktionieren oder?<br />
(vorrausgesetzt Klasse1 wurde mit new erzeugt und es wird nicht mehr darauf zugegriffen nachdem funktion1 aufgerufen wurde)</p>
</blockquote>
<p>Nein - das Codestück ist kritisch, weil die Funktion der Klasse selbst noch am Laufen ist, während das Objekt schon zerstört wurde. Zudem wird nachher normalerweise nochmals der Destruktor der (jetzt toten) Klasse aufgerufen.</p>
</blockquote>
<p>Daß die Funktion selbst noch am Laufen ist, sollte ja kein Problem sein. Member-Funktionen von Klassen sind schließlich auch nur &quot;normale&quot; Funktionen, denen implizit der this-Zeiger übergeben wird. Nur auf das Objekt selbst darf nach dem delete natürlich in keinster Weise mehr zugegriffen werden.</p>
<p>Und warum sollte der Destruktor nochmal aufgerufen werden? Daß man nicht ein zweites Mal den selben Zeiger löschen darf ist schon klar, aber das gilt ja unabhängig davon, wer das delete aufruft.<br />
Mit einem privaten Destruktor könnte man außerdem sicherstellen, daß niemand anders das Objekt zerstören kann, und daß sich keine Objekte der Klasse auf dem Stack erzeugen lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1626360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1626360</guid><dc:creator><![CDATA[dooooomi]]></dc:creator><pubDate>Sun, 07 Dec 2008 03:07:48 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Sun, 07 Dec 2008 10:38:15 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Du kannst dir also merken: Objekte können sich nicht selber zerstören.</p>
</blockquote>
<p>Doch, können sie. Das war ja gerade der Punkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1626412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1626412</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sun, 07 Dec 2008 10:38:15 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Sun, 07 Dec 2008 12:20:51 GMT]]></title><description><![CDATA[<p>dooooomi schrieb:</p>
<blockquote>
<p>Daß die Funktion selbst noch am Laufen ist, sollte ja kein Problem sein.</p>
</blockquote>
<p>Aber kann man sich auch drauf verlassen? Es gibt ja genügend Dinge, die in 99% der Fälle funktionieren...</p>
<p>dooooomi schrieb:</p>
<blockquote>
<p>Und warum sollte der Destruktor nochmal aufgerufen werden?</p>
</blockquote>
<p>Ich ging dabei von Stack-Deklarationen aus.</p>
<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Doch, können sie. Das war ja gerade der Punkt.</p>
</blockquote>
<p>Hm, dann hab ich das wohl nicht mitgekriegt. Aber mal abgesehen davon, wie sicher das ist - ich finde es vom Design her eher fragwürdig, wenn sich ein Objekt selbst zerstören sollte, gerade mit solchen Dingen wie Destruktor privat und nur <code>new</code> für die Konstruktion zulassen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1626452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1626452</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 07 Dec 2008 12:20:51 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Sun, 07 Dec 2008 15:47:02 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>dooooomi schrieb:</p>
<blockquote>
<p>Daß die Funktion selbst noch am Laufen ist, sollte ja kein Problem sein.</p>
</blockquote>
<p>Aber kann man sich auch drauf verlassen? Es gibt ja genügend Dinge, die in 99% der Fälle funktionieren...</p>
</blockquote>
<p>Also, zumindest laut <a href="http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.15" rel="nofollow">FAQ</a> ist &quot;Selbstmord&quot; von Objekten erlaubt. Ich gehe einfach mal davon aus, daß im C++-Standard nichts gegenteiliges steht.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Aber mal abgesehen davon, wie sicher das ist - ich finde es vom Design her eher fragwürdig, wenn sich ein Objekt selbst zerstören sollte, gerade mit solchen Dingen wie Destruktor privat und nur <code>new</code> für die Konstruktion zulassen...</p>
</blockquote>
<p>In den allermeisten Fällen gibt es sicherlich bessere Lösungen. Aber ich würde <code>delete this</code> (oder eine indirekte Variante davon) nicht zwangsläufig als schlechtes Design ansehen. Manchmal weiß ein Objekt eben selbst am besten, wenn es nicht mehr gebraucht wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1626537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1626537</guid><dc:creator><![CDATA[dooooomi]]></dc:creator><pubDate>Sun, 07 Dec 2008 15:47:02 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor und this Zeiger on Sun, 07 Dec 2008 15:53:02 GMT]]></title><description><![CDATA[<p>Schreibt anständige Programme, dann braucht ihr sowas komisches garnicht erst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1626543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1626543</guid><dc:creator><![CDATA[mal ehrlich]]></dc:creator><pubDate>Sun, 07 Dec 2008 15:53:02 GMT</pubDate></item></channel></rss>