<?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[Selfdelete und dann Thread beenden]]></title><description><![CDATA[<p>Könnte ich nach einem Aufruf von:</p>
<pre><code class="language-cpp">delete this;
</code></pre>
<p>innerhalb einer Klasse noch den aktuellen Thread mit ExitThread(); verlassen? Oder wird dadurch der Thread schon automatisch beenden? Oder ist das gar nicht möglich?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/177857/selfdelete-und-dann-thread-beenden</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 04:48:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/177857.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 04 Apr 2007 17:59:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Wed, 04 Apr 2007 17:59:56 GMT]]></title><description><![CDATA[<p>Könnte ich nach einem Aufruf von:</p>
<pre><code class="language-cpp">delete this;
</code></pre>
<p>innerhalb einer Klasse noch den aktuellen Thread mit ExitThread(); verlassen? Oder wird dadurch der Thread schon automatisch beenden? Oder ist das gar nicht möglich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259456</guid><dc:creator><![CDATA[Dr. C++]]></dc:creator><pubDate>Wed, 04 Apr 2007 17:59:56 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Wed, 04 Apr 2007 18:17:49 GMT]]></title><description><![CDATA[<p>Hm, sollte klappen, wenn du das im Destruktor der Klasse behandelst.<br />
Es kommt aber auch darauf an, unter welchem OS/Compiler du das tust.<br />
Der sauberste Weg ist es mit Sicherheit aber nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259468</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Wed, 04 Apr 2007 18:17:49 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Wed, 04 Apr 2007 18:15:23 GMT]]></title><description><![CDATA[<p>phlox81 schrieb:</p>
<blockquote>
<p>Hm, sollte klappen, wenn du das im Konstruktor der Klasse behandelst.</p>
</blockquote>
<p>Das passiert nicht im Konstruktor, sondern beim Verlust einer Client-Verbindung.</p>
<p>phlox81 schrieb:</p>
<blockquote>
<p>Der sauberste Weg ist es mit Sicherheit aber nicht...</p>
</blockquote>
<p>Wie geht es besser?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259473</guid><dc:creator><![CDATA[Dr. C++]]></dc:creator><pubDate>Wed, 04 Apr 2007 18:15:23 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Wed, 04 Apr 2007 18:18:09 GMT]]></title><description><![CDATA[<p>Dr. C++ schrieb:</p>
<blockquote>
<p>phlox81 schrieb:</p>
<blockquote>
<p>Hm, sollte klappen, wenn du das im Konstruktor der Klasse behandelst.</p>
</blockquote>
<p>Das passiert nicht im Konstruktor, sondern beim Verlust einer Client-Verbindung.</p>
<p>phlox81 schrieb:</p>
<blockquote>
<p>Der sauberste Weg ist es mit Sicherheit aber nicht...</p>
</blockquote>
<p>Wie geht es besser?</p>
</blockquote>
<p>Ich meinte nicht den Konstruktor sondern den Destruktor.<br />
Ich meinte damit, das du ExitThread vor delete this aufrufst, oder im Destruktor.</p>
<p>Am besten zeigst du mal ein wenig mehr Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259476</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Wed, 04 Apr 2007 18:18:09 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Wed, 04 Apr 2007 18:21:16 GMT]]></title><description><![CDATA[<p>Sorry, verlesen.</p>
<p>Wenn ich ExitThread(); vor delete this; aufrufe, wird das Selfdelete ja gar nicht mehr ausgeführt um in den Destructor kann ich ExitThread(); auch nicht schieben, weil das Objekt auch von außen an anderer Stelle gelöscht wird und sonst ein Thread beendet werden würde, der eigentlich noch weiter laufen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259482</guid><dc:creator><![CDATA[Dr. C++]]></dc:creator><pubDate>Wed, 04 Apr 2007 18:21:16 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Wed, 04 Apr 2007 20:11:54 GMT]]></title><description><![CDATA[<p>So, ich habs hingekriegt. Ich hab das Handle beim Erzeugen des Objektes mitgegeben und hatte dann auch das Handle was ich haben wollte, nicht das aktuelle, im Destruktor zur Verfügung. Thx für den Denkanstoß <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/1259579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259579</guid><dc:creator><![CDATA[Dr. C++]]></dc:creator><pubDate>Wed, 04 Apr 2007 20:11:54 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Wed, 04 Apr 2007 21:57:00 GMT]]></title><description><![CDATA[<p>Also folgendes ist problemlos möglich, und AFAIK auch ganz legales C++:</p>
<pre><code class="language-cpp">void Foo::Bar()
{
    DWORD exitCode = this-&gt;DetermineExitCode();
    delete this;
    ::ExitThread(exitCode);
}
</code></pre>
<p>Wichtig ist bloss dass du &quot;this&quot; nach dem &quot;delete this&quot; nichtmehr dereferenzierst, nicht explizit und auch nicht implizit. Da ExitThread aber &quot;this&quot; nicht braucht, ist das OK.<br />
Blöd ist nur dass ExitThread kein stack-unwinding macht, und das kann durchaus ein Problem darstellen je nachdem von wo aus &quot;Bar&quot; aufgerufen wird.</p>
<p>Besser wäre es wohl den Thread irgendwie &quot;kontrolliert&quot; zu beenden, also z.B. irgendeine Exception zu werfen die per definitionem nirgends gefangen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259627</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 04 Apr 2007 21:57:00 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Thu, 05 Apr 2007 06:51:24 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>...<br />
Wichtig ist bloss dass du &quot;this&quot; nach dem &quot;delete this&quot; nichtmehr dereferenzierst, nicht explizit und auch nicht implizit. Da ExitThread aber &quot;this&quot; nicht braucht, ist das OK....</p>
</blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>...<br />
Blöd ist nur dass ExitThread kein stack-unwinding macht, ...</p>
</blockquote>
<p>Naja, wenn Zweiteres nicht wäre, wäre Ersteres vermutlich nicht mehr gegeben, oder ? <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 stimme Dir zu: Ich denke, das sollte man anders/besser lösen (Da sich einen Klasse nicht selbst erzeugt, sollte sie sich auch nicht selbst vernichten)...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259738</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 05 Apr 2007 06:51:24 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Thu, 05 Apr 2007 08:43:14 GMT]]></title><description><![CDATA[<p>An manchen Stellen kann sich die Klassen nun mal nur selbst löschen, z.B. nach dem ungeplanten Schließens einer User-Verbindung. Da wird bei send() und recv() geprüft ob die Verbindung geschlossen wurde und wenn das der Fall war, wird die Instanz aus ner Sammel-Map entfernt und dann mit delete this; gelöscht. Ich könnt zwar auch nen neuen Thread erstellen, der dann die Klasse löscht, wär aber auch ein sinnloser Aufwand, wenns so genauso geht.</p>
<p>Nur noch eine Frage: wenn ein Thread mit TerminateThread() beendet wird, werden dann die Variablen, die normal mit int a; oder so angelegt wurden, wieder freigegeben oder bleiben die im Speicher liegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259809</guid><dc:creator><![CDATA[Dr. C++]]></dc:creator><pubDate>Thu, 05 Apr 2007 08:43:14 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Thu, 05 Apr 2007 08:50:48 GMT]]></title><description><![CDATA[<p>TerminateThread() schießt den Thread SOFORT ab, ohne Aufräumarbeiten. Aber du hast auch die Möglichkeit, den Thread sanft von innen zu beenden (wenn die Thread-Funktion per return verlassen wird, räumt der Thread auf und beendet sich dann).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259815</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 05 Apr 2007 08:50:48 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Thu, 05 Apr 2007 08:55:02 GMT]]></title><description><![CDATA[<p>Ich weiß bloß nicht wie ich das machen soll: der Thread hängt in einer Endlosschleife und in dieser wartet er wiederrum mit recv() auf ankommende Daten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259826</guid><dc:creator><![CDATA[Dr. C++]]></dc:creator><pubDate>Thu, 05 Apr 2007 08:55:02 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Thu, 05 Apr 2007 09:05:09 GMT]]></title><description><![CDATA[<p>Dann mach doch aus der Endlosschleife eine &quot;ordentliche&quot; Schleife <code>while(socket_active(src))...</code> (keine Ahnung, mit welcher Funktion du den Socket-Status kontrollieren kannst).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259842</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 05 Apr 2007 09:05:09 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Thu, 05 Apr 2007 09:12:10 GMT]]></title><description><![CDATA[<p>Auf die Idee bin ich auch schon gekommen, aber in der Schleife empfängt er nicht nur am Anfang Daten sondern prüft was angekommen ist, schickt ne Antwort und wartet wieder. Da müsst ich ja an jede Stelle, an der recv(); aufgerufen wird innerhalb des Threads ein if schreiben um zu prüfen ob die Verbindung geschlossen wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259851</guid><dc:creator><![CDATA[Dr. C++]]></dc:creator><pubDate>Thu, 05 Apr 2007 09:12:10 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Thu, 05 Apr 2007 11:05:41 GMT]]></title><description><![CDATA[<p>Ein ähnliches Problem habe ich auch mit der Funktion recv() (aus der Winsock2-DLL).<br />
Diese läuft in meinem Projekt ebenso in einem eigenen Thread. Nun würde ich gerne den Thread sauber beenden (ohne ExitThread oder TerminateThread), wenn der Anwender die aktuelle Sitzung beendet (das Hauptprogramm ist weiter aktiv!).</p>
<p>Da recv() aber blockt, wüßte ich gerne, wie man die Verbindung von außen kappt, so daß der Thread sich selbst normal beenden kann.</p>
<p>P.S.<br />
Hallo &quot;Dr. C++&quot;:<br />
Wenn die Verbindung von außen geschlossen wird, so gibt recv() 0 zurück bzw. einen der vordefinierten Stati (z.B. WSAECONNRESET, WSAECONNABORTED oder WSAESHUTDOWN).</p>
<p>Edit: Ich sehe gerade, daß im MSDN-Beispiel ein Fehler ist (wo ich die Infos herhabe). Die Funktion WSAGetLastError() gibt einen der definierten Fehlerwerte zurück, wenn recv() SOCKET_ERROR (-1) zurückgibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259922</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Thu, 05 Apr 2007 11:05:41 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Thu, 05 Apr 2007 11:59:46 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>...<br />
Wichtig ist bloss dass du &quot;this&quot; nach dem &quot;delete this&quot; nichtmehr dereferenzierst, nicht explizit und auch nicht implizit. Da ExitThread aber &quot;this&quot; nicht braucht, ist das OK....</p>
</blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>...<br />
Blöd ist nur dass ExitThread kein stack-unwinding macht, ...</p>
</blockquote>
<p>Naja, wenn Zweiteres nicht wäre, wäre Ersteres vermutlich nicht mehr gegeben, oder ? <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 stimme Dir zu: Ich denke, das sollte man anders/besser lösen (Da sich einen Klasse nicht selbst erzeugt, sollte sie sich auch nicht selbst vernichten)...</p>
<p>Gruß,</p>
<p>Simon2.</p>
</blockquote>
<p>Fix sakrament, wieso werden mir hier ständig die Worte im Mund verdreht. Ich habe nichts dagegen wenn sich Objekte selbst löschen, so wie z.B. in COM ist das vollkommen OK. Ich habe nur was dagegen einen Thread abzuschiessen der noch Objekte rumliegen hat.</p>
<p>BTW: Wenn ExitThread stack unwinding machen würde, dann bräuchte man das ganze &quot;delete this&quot; nicht, d.h. es wäre auch kein Problem.</p>
<p>----</p>
<p>@Dr. C++ : kapsel doch die Socket Verbindung in eine Klasse, und bring' der bei Exceptions zu werden wenn ein Socket Call fehlschlägt. Damit fliegt automatisch aus send/recv eine Exception raus wenn die Verbindung getrennt wrude, und das Problem ist gegessen.</p>
<p>Es ist auf jeden Fall eine ganz schlechte angewohnheit unsaubere Lösungen mit &quot;ja aber&quot; zu rechtfertigen, so wie in &quot;ja, aber die saubere Lösung wäre ja so viel Arbeit&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259976</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 05 Apr 2007 11:59:46 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Thu, 05 Apr 2007 12:11:46 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>@Dr. C++ : kapsel doch die Socket Verbindung in eine Klasse, und bring' der bei Exceptions zu werden wenn ein Socket Call fehlschlägt. Damit fliegt automatisch aus send/recv eine Exception raus wenn die Verbindung getrennt wrude, und das Problem ist gegessen.</p>
</blockquote>
<p>Die Socket-Verbindungen sind bereits in einer Klasse untergebracht. Und mit den Exceptions: müsste ich dann um den ganzen &quot;eigentlichen&quot; Code ein try schreiben und darunter nur ein catch, das den Thread mit einem einfachen return beendet?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259991</guid><dc:creator><![CDATA[Dr. C++]]></dc:creator><pubDate>Thu, 05 Apr 2007 12:11:46 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Thu, 05 Apr 2007 12:13:18 GMT]]></title><description><![CDATA[<p>Dr. C++ schrieb:</p>
<blockquote>
<p>Und mit den Exceptions: müsste ich dann um den ganzen &quot;eigentlichen&quot; Code ein try schreiben und darunter nur ein catch, das den Thread mit einem einfachen return beendet?!</p>
</blockquote>
<p>Kurz: Ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259995</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 05 Apr 2007 12:13:18 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Thu, 05 Apr 2007 19:02:46 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>...<br />
Fix sakrament, wieso werden mir hier ständig die Worte im Mund verdreht....</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Sorry, dann hatte ich Dein Posting mißverstanden.<br />
Also: Die Abneigung von &quot;selbstlöschenden Objekten&quot; ist meine ganz private eigene Meinung und hat nix mit hustbaer zu tun.</p>
<p>Sorry,</p>
<p>Simon2.</p>
<p>Nachtrag:</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>...<br />
BTW: Wenn ExitThread stack unwinding machen würde, dann bräuchte man das ganze &quot;delete this&quot; nicht, d.h. es wäre auch kein Problem.<br />
...</p>
</blockquote>
<p>Hmmmm vielleicht habe ich es noch nicht richtig begriffen, aber &quot;delete this&quot; brauche ich doch nur für Heapobjekte, die durch stack unwinding nicht automatisch abgeräumt werden .... oder hattest Du dann Destruktoren einer kapselnden Klasse im Sinn ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1260347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260347</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 05 Apr 2007 19:02:46 GMT</pubDate></item><item><title><![CDATA[Reply to Selfdelete und dann Thread beenden on Thu, 05 Apr 2007 19:00:27 GMT]]></title><description><![CDATA[<p>@Dr. C++:<br />
Und du musst natürlich zusehen dass der ganze Code dazwischen exception safe ist... <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/1260348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1260348</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 05 Apr 2007 19:00:27 GMT</pubDate></item></channel></rss>