<?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[Eigenes Objekt löschen]]></title><description><![CDATA[<p>Was würdet ihr von folgender Destroy-Methode halten und sagen ? :</p>
<pre><code class="language-cpp">class Klasse
{
    Klasse();
    void Methode1();
    void Methode2();

    void Destroy()
    {
        delete this;
    }
};
</code></pre>
<p>Ich benutze sowas nicht, aber ich möchte eure Meinung dazu wissen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/241544/eigenes-objekt-löschen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 08:14:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/241544.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 22 May 2009 08:12:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 08:14:20 GMT]]></title><description><![CDATA[<p>Was würdet ihr von folgender Destroy-Methode halten und sagen ? :</p>
<pre><code class="language-cpp">class Klasse
{
    Klasse();
    void Methode1();
    void Methode2();

    void Destroy()
    {
        delete this;
    }
};
</code></pre>
<p>Ich benutze sowas nicht, aber ich möchte eure Meinung dazu wissen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714025</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Fri, 22 May 2009 08:14:20 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 08:19:57 GMT]]></title><description><![CDATA[<p>Ist das eigentlich eine spezialität von C++ Programmieren, dass sie alles mögliche was man an komischem Code schreiben kann, auch machen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714030</guid><dc:creator><![CDATA[hmmmm?]]></dc:creator><pubDate>Fri, 22 May 2009 08:19:57 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 08:42:06 GMT]]></title><description><![CDATA[<p>FreakY&lt;3Cpp schrieb:</p>
<blockquote>
<p>Was würdet ihr von folgender Destroy-Methode halten und sagen ?</p>
</blockquote>
<p>Es gibt Situationen wo das sinnvoll sein kann - aber die meisten Menschen werden nie in so eine Situation kommen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714032</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 22 May 2009 08:42:06 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 08:45:16 GMT]]></title><description><![CDATA[<p>hmmmm? schrieb:</p>
<blockquote>
<p>Ist das eigentlich eine spezialität von C++ Programmieren, dass sie alles mögliche was man an komischem Code schreiben kann, auch machen</p>
</blockquote>
<p>Ich glaube, es ist eine Spezialität von C++-Programmierern, dass sie sich gerne mit den Möglichkeiten und Grenzen der Sprache machen und gerne Neues ausprobieren.<br />
Wem es reicht, jeweils einen Standardweg für Standardprobleme zu haben, sollte eine andere Sprache (deren Namen ich jetzt hier nicht nennen möchte <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="😉"
    /> ) nehmen. <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>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19847">@Freaky</a>: Ich glaube, der Code ist nicht in jeder Situation gefährlich ... aber in fast jeder. <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="😉"
    /><br />
Beispiele:<br />
- Woher soll der &quot;Besitzer&quot; des Objekts wissen, dass sein Objekt nicht mehr gültig ist (Kann zwar auch auf Anderem Weg passieren, aber hier ist es wirklich eingebaut).<br />
- Was mit Objekten, die gar nicht mit new erzeugt wurden?<br />
- Sobald &quot;Destroy()&quot; mehr macht als nur delete: Das &quot;klassische&quot; Zerstören von außen (Scope/delete) ruft Destroy() ja nicht auf ... da fehlt diese Funktionialität also.</p>
<p>Insgesamt: Kann man machen, braucht aber sehr viele flankierende Maßnahmen und größte Vorsicht - und das bei eher geringem Nutzen.<br />
Ich würde meine Objekte immer so zu stricken versuchen, dass man sie mit keiner Aktion &quot;lebensunwert&quot; machen kann, so dass es reicht, sie jeweils von außen zu zerstören.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714033</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 22 May 2009 08:45:16 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 09:59:25 GMT]]></title><description><![CDATA[<p>Ich finde delete this in mehreren Situationen praktisch und setze dies auch ein.<br />
Noch zwei Kommentare:</p>
<blockquote>
<p>- Was mit Objekten, die gar nicht mit new erzeugt wurden?</p>
</blockquote>
<p>ctor / dtor private. Eine (statische) make(..) Methode die eine Heap basiertes Objekt zurückgibt und eben eine destroy() Methode, welche delete this aufruft.</p>
<p>So wird erzwungen, dass das Objekt auf dem Heap ist, was manchmal nötig ist.</p>
<blockquote>
<p>- Woher soll der &quot;Besitzer&quot; des Objekts wissen, dass sein Objekt nicht mehr gültig ist (Kann zwar auch auf Anderem Weg passieren, aber hier ist es wirklich eingebaut).</p>
</blockquote>
<p>Es ist nicht mehr gültig, weil der Besitzer eben Destroy() aufgerufen hat. Genau wie nach einem delete. Sehe da keinen Unterschied.</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714060</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 22 May 2009 09:59:25 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 10:09:22 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Ich finde delete this in mehreren Situationen praktisch und setze dies auch ein.</p>
</blockquote>
<p>das würde mich echt mal interessieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714068</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 22 May 2009 10:09:22 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 10:17:32 GMT]]></title><description><![CDATA[<p>Die erste Situation ist oben schon genannt. Ein Objekt macht nur auf dem Heap Sinn (weil es z.B. via Windows Messages gepostet wird) und muss desshalb mit new erzeugt sein.</p>
<p>Eine andere Situation ist, wenn ein Objekt über DLL Grenzen hinweg erzeugt wird (heisst new XXX ist im Code der DLL). Dann muss auch das delete wieder im DLL Code sein (z.B. weil verschiedene Runtimes benutzt werden). Dies kann einfach realisiert werden indem die entspechenden Objekte eine destroy() Methode haben.</p>
<p>Momentan fallen mir nur diese beiden Situationen ein.<br />
An welche hast Du gedacht?</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714074</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 22 May 2009 10:17:32 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 11:02:27 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>...</p>
<blockquote>
<p>- Was mit Objekten, die gar nicht mit new erzeugt wurden?</p>
</blockquote>
<p>ctor / dtor private. ...</p>
</blockquote>
<p>Das ist <em>mir</em> schon klar. Aber das reicht noch nicht - man muss sich auch mit Kopieren, Referenzieren, ... beschäftigen.<br />
Das sind die Dinge, die ich meinte mit</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>...<br />
Insgesamt: Kann man machen, braucht aber sehr viele flankierende Maßnahmen und größte Vorsicht - und das bei eher geringem Nutzen.<br />
...</p>
</blockquote>
<p>In meinen Augen sind die von Dir genannten Beispiele (&quot;macht nur auf Heap Sinn&quot;, Erzeuger/Vernichter-Trennung) nicht Eigenschaften eines Objekts, sondern seiner Umgebung ... und großartige Einsatzgebiete für Factory- bzw. Managerklassen.<br />
Ich sehe da weder die Notwendigkeit noch nennenswerte Vorteile ggü. den Bordmitteln &quot;Konstruktor/Destruktor&quot;.</p>
<p>Nochmal: Man <em>kann</em> sowas bestimmt vorteilhaft einsetzen ... aber die beiden Beispiel zählen für mich nicht dazu.</p>
<p>Noch ein paar Anmerkungen von mir:<br />
1.)</p>
<p>theta schrieb:</p>
<blockquote>
<p>...Es ist nicht mehr gültig, weil der Besitzer eben Destroy() aufgerufen hat. Genau wie nach einem delete. Sehe da keinen Unterschied....</p>
</blockquote>
<p>Der Unterschied ist, dass delete ein <em>Standard</em>mechanismus ist, dessen Verhalten standardisiert ist. Schonmal daran gedacht, dass mit &quot;Destroy()&quot; kein smartpointer o.a. &quot;Tools&quot; genutzt werden kann? &quot;delete&quot; kennen die alle, aber für &quot;Destroy&quot;-Objekte musst Du alles neu erfinden.</p>
<p>2.)<br />
Ich würde sehr genau überlegen, wie sich &quot;interner Status&quot; (wie z.B. &quot;ungültig&quot;) und &quot;C++-Lebenszeit&quot; miteinander zusammenhängen und nicht allzu schnell das eine mit dem Anderen verbinden. Die std::-Streams sind da ein gutes Beispiel ...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714097</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 22 May 2009 11:02:27 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 11:06:28 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Die erste Situation ist oben schon genannt. Ein Objekt macht nur auf dem Heap Sinn (weil es z.B. via Windows Messages gepostet wird) und muss desshalb mit new erzeugt sein.</p>
</blockquote>
<p>dh ich darf kein fast_alloc verwenden weil ich viele Messages schicke?<br />
ja, macht sinn...</p>
<blockquote>
<p>Eine andere Situation ist, wenn ein Objekt über DLL Grenzen hinweg erzeugt wird (heisst new XXX ist im Code der DLL). Dann muss auch das delete wieder im DLL Code sein (z.B. weil verschiedene Runtimes benutzt werden). Dies kann einfach realisiert werden indem die entspechenden Objekte eine destroy() Methode haben.</p>
</blockquote>
<p>oder noch besser. ich erstelle objekte per</p>
<p>make_xxx()<br />
und zerstöre sie per<br />
destroy_xxx()</p>
<p>wäre viel konsistenter und man könnte leichter mehrere alloc strategien anbieten.</p>
<blockquote>
<p>An welche hast Du gedacht?</p>
</blockquote>
<p>dirty hacks die man vor dem anwender verstecken will. wie gesagt: die wenigstens leute weren je in eine situation kommen wo ein delete this sinn macht.</p>
<p>deine beispiele haben sowieso eine create_xxx funktion - das schreit doch nach eienr delete_xxx funktion...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714105</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 22 May 2009 11:06:28 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 11:15:57 GMT]]></title><description><![CDATA[<p>Kann man auch irgendwie für abgeleitete Klassen von &quot;Klasse&quot; mit protected Destruktor erzwingen, dass sie auf dem Heap erstellt werden ohne was an der abgeleiteten Klasse zu ändern(also Destruktor dort ebenfalls private bzw. protected zu machen)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714115</guid><dc:creator><![CDATA[krabbels]]></dc:creator><pubDate>Fri, 22 May 2009 11:15:57 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 11:33:55 GMT]]></title><description><![CDATA[<p>Ich habe hin und wieder referenzgezählte Objekte. Das Modul bekommt von irgendwo her ein Objekt und ruft addRef auf, um die Referenz hoch zu zählen. Ist das Modul mit dem Objekt fertig, teilt es das mit release dem Objekt mit. Da das Objekt seinen Refernzzähler kennt, kann es dann selbst erkennen, ob jemand noch eine Referenz auf das Objekt hält. Wenn nicht, dann ruft das Objekt eben dieses berühmte &quot;delete this&quot; auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714122</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Fri, 22 May 2009 11:33:55 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 11:35:26 GMT]]></title><description><![CDATA[<p>könnte das zu einer Endlosschleife führen?</p>
<pre><code class="language-cpp">Klasse::Klasse() { delete this; } 
    Klasse::~Klasse() { new this; }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1714123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714123</guid><dc:creator><![CDATA[xBlackKnightx]]></dc:creator><pubDate>Fri, 22 May 2009 11:35:26 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 11:40:12 GMT]]></title><description><![CDATA[<p>xBlackKnightx schrieb:</p>
<blockquote>
<p>könnte das zu einer Endlosschleife führen?</p>
</blockquote>
<p>nein, nur zu compilerfehlern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714127</guid><dc:creator><![CDATA[sichadat]]></dc:creator><pubDate>Fri, 22 May 2009 11:40:12 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 13:28:25 GMT]]></title><description><![CDATA[<p>FreakY&lt;3Cpp schrieb:</p>
<blockquote>
<p>Was würdet ihr von folgender Destroy-Methode halten und sagen ? [...]<br />
Ich benutze sowas nicht, aber ich möchte eure Meinung dazu wissen.</p>
</blockquote>
<p>Ich finde sowas sehr schlecht, da unterschiedliche Kontrollebenen für Speicheranforderung und -freigabe erforderlich sind.</p>
<p>Wenn man in C++ ein <code>new</code> einsetzt, erwartet man normalerweise, dass man ein Objekt mit <code>delete</code> wieder freigeben kann (von speziellen Anwendungsfällen wie Smart Pointers oder Pointer-Container mal abgesehen, bei denen man aber weiss, dass man sich nicht um die Freigabe zu kümmern hat). Ich finde auch C++-Bibliotheken sehr schlimm, die auf diese Weise versuchen, einen Garbage Collector nachzubauen und &quot;benutzerfreundlicher&quot; zu sein. Meistens resultiert das nur in Inkonsistenzen, unnötigem Overhead und Einschränkungen für den Benutzer.</p>
<p>Zu den weiteren Sicherheits- und Fehleranfälligkeitsaspekten wurde ja bereits genügend gesagt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714226</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 22 May 2009 13:28:25 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 13:38:55 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>FreakY&lt;3Cpp schrieb:</p>
<blockquote>
<p>Was würdet ihr von folgender Destroy-Methode halten und sagen ? [...]<br />
Ich benutze sowas nicht, aber ich möchte eure Meinung dazu wissen.</p>
</blockquote>
<p>Ich finde sowas sehr schlecht, da unterschiedliche Kontrollebenen für Speicheranforderung und -freigabe erforderlich sind.</p>
<p>Wenn man in C++ ein <code>new</code> einsetzt, erwartet man normalerweise, dass man ein Objekt mit <code>delete</code> wieder freigeben kann (von speziellen Anwendungsfällen wie Smart Pointers oder Pointer-Container mal abgesehen, bei denen man aber weiss, dass man sich nicht um die Freigabe zu kümmern hat). Ich finde auch C++-Bibliotheken sehr schlimm, die auf diese Weise versuchen, einen Garbage Collector nachzubauen und &quot;benutzerfreundlicher&quot; zu sein. Meistens resultiert das nur in Inkonsistenzen, unnötigem Overhead und Einschränkungen für den Benutzer.</p>
<p>Zu den weiteren Sicherheits- und Fehleranfälligkeitsaspekten wurde ja bereits genügend gesagt...</p>
</blockquote>
<p>Und wenn man ein <code>MyObject* MyObject::create()</code> einsetzt kommt ein <code>MyObject-&gt;destroy()</code> gar nicht so unerwartet und erfordert eben keine unterschiedlichen Kontrollebenen.</p>
<p>Und natürlich sind da viele Spezialfälle, die solche Techniken erforderlich machen, aber das ist ja das schöne an C++: dass es eben auch für Spezialfälle geeignete Sprachmittel gibt und nicht nur für Standardfälle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714237</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Fri, 22 May 2009 13:38:55 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 13:45:28 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Und wenn man ein <code>MyObject* MyObject::create()</code> einsetzt kommt ein <code>MyObject-&gt;destroy()</code> gar nicht so unerwartet und erfordert eben keine unterschiedlichen Kontrollebenen.</p>
</blockquote>
<p>Eine statische Factory-Methode? Also sowas?</p>
<pre><code class="language-cpp">MyClass* ptr = MyClass::create();
</code></pre>
<p>Aber für die Zerstörung gibt es keine analoge Methode, sondern das muss das Objekt selber übernehmen?</p>
<pre><code class="language-cpp">ptr-&gt;Destroy();
</code></pre>
<p>Das sieht mir nicht gerade nach gleicher Kontrollebene aus, geschweige denn würde ich sowas als &quot;erwartet&quot; bezeichnen.</p>
<p>tntnet schrieb:</p>
<blockquote>
<p>Und natürlich sind da viele Spezialfälle, die solche Techniken erforderlich machen, aber das ist ja das schöne an C++: dass es eben auch für Spezialfälle geeignete Sprachmittel gibt und nicht nur für Standardfälle.</p>
</blockquote>
<p>Meiner Ansicht resultieren aber viele dieser Spezialfälle aus fehlerhaftem Design. In den meisten Fällen sollte es eigentlich möglich sein, ein Objekt konsistent zu erzeugen und zu zerstören. Zumindest hatte ich selber noch nie einen Fall, bei dem ich auf ein übles <code>delete this</code> zurückgreifen musste, und kann mir das deshalb vielleicht auch zu wenig vorstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714240</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 22 May 2009 13:45:28 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 15:12:01 GMT]]></title><description><![CDATA[<p>Ich fand sowas ganz hilfreich im Umfeld von Multithreading-Anwendungen... der Worker-Thread ist in einem Objekt gekapselt, und sobald er seinen Job erledigt hat löscht er sich höflicherweise selbst einschließlich seines Datenobjekts.</p>
<p>Ansonsten muß man immer noch einen &quot;Anker&quot; haben, der ruhende Threads entfernt. Das schafft nur überflüssige Synchronisationsaufwände.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714289</guid><dc:creator><![CDATA[Marc++us]]></dc:creator><pubDate>Fri, 22 May 2009 15:12:01 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 15:31:28 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19933">@Marc</a>++us,<br />
Wäre bei sowas nicht ein Threadpool besser geeignet? Sobald ein Workerthread seine Arbeit beendet hat, wird er nicht zerstört, sondern legt sich schlafen, bis der Pool, zu welchem der Thread gehört, ihm eine neue Aufgabe zuteilt und wieder weckt.</p>
<p>Für das erstellen und löschen von Threads ist dann die Klasse zuständig, welche den Pool verwaltet.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714303</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 22 May 2009 15:31:28 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 16:11:20 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19933">@Marc</a>++us,<br />
Wäre bei sowas nicht ein Threadpool besser geeignet? Sobald ein Workerthread seine Arbeit beendet hat, wird er nicht zerstört, sondern legt sich schlafen, bis der Pool, zu welchem der Thread gehört, ihm eine neue Aufgabe zuteilt und wieder weckt.<br />
Für das erstellen und löschen von Threads ist dann die Klasse zuständig, welche den Pool verwaltet.<br />
Grüssli</p>
</blockquote>
<p>das ändert nix. dann ist es eben das Job-Objekt, das sich nach erledigung des jobs selber löscht (und dabei den zwischenzeitlich an sich gebundenen thread aus dem pool freigibt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714320</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 22 May 2009 16:11:20 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Fri, 22 May 2009 19:33:33 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>das ändert nix. dann ist es eben das Job-Objekt, das sich nach erledigung des jobs selber löscht (und dabei den zwischenzeitlich an sich gebundenen thread aus dem pool freigibt).</p>
</blockquote>
<p>So war das nicht gemeint. Zum einen soll der Job nichts weiteres sein als eine Art von Funktionszeiger, bzw. zum Beispiel ein <code>boost::function&lt;void()&gt;</code> , zum anderen soll der Thread nicht gelöscht werden, sondern eben schlafen gelegt. Das Objekt bleibt somit bestehen, der Thread wird nur über ein Event oder Mutex schlafen gelegt.</p>
<p>Kurze, schnelle und womglich hässliche Implementierung, nur zur Verdeutlichung der Idee:</p>
<pre><code class="language-cpp">#include &lt;boost/thread.hpp&gt;
#include &lt;boost/scoped_ptr.hpp&gt;
#include &lt;boost/noncopyable.hpp&gt;
#include &lt;boost/ptr_container/ptr_vector.hpp&gt;

#include &lt;vector&gt;
#include &lt;cassert&gt;
#include &lt;algorithm&gt;
#include &lt;functional&gt;

class WorkerThread
	: public boost::noncopyable
{
	// Attributes //
private:
	bool m_continue;
	boost::function&lt;void()&gt; m_job;

	boost::mutex m_condition;
	boost::scoped_ptr&lt;boost::thread&gt; m_thread;

	// Constructor //
public:
	WorkerThread()
		: m_continue(true)
		, m_job()
		, m_condition()
		, m_thread()
	{
		m_condition.lock();
		m_thread.reset(new boost::thread(&amp;WorkerThread::run, this));
	}

	WorkerThread(boost::function&lt;void()&gt; job)
		: m_continue(true)
		, m_job(job)
		, m_condition()
		, m_thread()
	{
		m_condition.lock();
		m_thread.reset(new boost::thread(&amp;WorkerThread::run, this));
	}

	// Methods //
private:
	bool wait_on_job()
	{
		while(m_continue &amp;&amp; !m_job)
		{
			m_condition.lock();
		}

		return m_continue;
	}

	void run()
	{
		boost::mutex mutex;
		boost::unique_lock&lt;boost::mutex&gt; lock(mutex);

		while(wait_on_job())
		{
			m_job();
			m_job.clear();
		}
	}

public:
	bool is_free() const
	{
		return m_job.empty();
	}

	void stop()
	{
		m_continue = false;
		m_condition.unlock();
	}

	void set_job(boost::function&lt;void()&gt; job)
	{
		assert(!job.empty());

		m_job = job;
		m_condition.unlock();
	}

	void join()
	{
		m_thread-&gt;join();
	}
};

class WorkerThreadPool
	: public boost::noncopyable
{
	// Typedefs //
private:
	typedef boost::ptr_vector&lt;WorkerThread&gt; Pool;

	// Attributes //
private:
	 Pool m_pool;

	// Constructor //
public:
	WorkerThreadPool()
		: m_pool()
	{
	}

	~WorkerThreadPool()
	{
		std::for_each(
			m_pool.begin(),
			m_pool.end(),
			std::mem_fun_ref(&amp;WorkerThread::join));
	}

	// Methods //
private:
	WorkerThread&amp; get_worker()
	{
		Pool::iterator iter = m_pool.begin();
		Pool::iterator end = m_pool.end();

		for(; iter != end; ++iter)
		{
			if(iter-&gt;is_free())
			{
				return *iter;
			}
		}

		m_pool.push_back(new WorkerThread());
		return m_pool.back();
	}

public:
	void execute(boost::function&lt;void()&gt; job)
	{
		WorkerThread&amp; worker = get_worker();
		worker.set_job(job);
	}
};
</code></pre>
<p>So ist die Speicherverwaltung geregelt und es müssen nicht immer neue Threads erstellt werden, dadurch werden auch kleinere Aufgaben interessant, um sie einem Thread zu übergeben.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714387</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 22 May 2009 19:33:33 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Sat, 23 May 2009 05:45:52 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>hmmmm? schrieb:</p>
<blockquote>
<p>Ist das eigentlich eine spezialität von C++ Programmieren, dass sie alles mögliche was man an komischem Code schreiben kann, auch machen</p>
</blockquote>
<p>Ich glaube, es ist eine Spezialität von C++-Programmierern, dass sie sich gerne mit den Möglichkeiten und Grenzen der Sprache machen und gerne Neues ausprobieren.</p>
</blockquote>
<p>Nur gibts meistens viel einfachere Lösungen für das eigentliche Problem. Liegt aber glaub ich auch an diesem Forum hier, da werden sehr oft Fragen zu den komischsten Implementierungsideen beantwortet, anstatt mal nach dem eigentlichen Problem zu fragen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714477</guid><dc:creator><![CDATA[hmmmm?]]></dc:creator><pubDate>Sat, 23 May 2009 05:45:52 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Sat, 23 May 2009 08:58:09 GMT]]></title><description><![CDATA[<p>hmmmm? schrieb:</p>
<blockquote>
<p>...Nur gibts meistens viel einfachere Lösungen für das eigentliche Problem. Liegt aber glaub ich auch an diesem Forum hier, da werden sehr oft Fragen zu den komischsten Implementierungsideen beantwortet, anstatt mal nach dem eigentlichen Problem zu fragen.</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="😮"
    /> <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="😮"
    /> <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 />
Also dann hast Du diesen Thread (und viele andere, die ich kenne) nicht richtig gelesen.<br />
Der quillt doch über von &quot;Gibt garantiert bessere Lösungen für ein konkretes Problem&quot; (allein ich habe mich ja schon fast müde geschrieben daran).<br />
... und das gilt für das Forum insgesamt: Eigentlich ist IMMER die erste Gegenfrage &quot;Welches Problem willst Du eigentlich lösen?&quot;<br />
Dein Einwand klingt eher nach Bashing ...</p>
<p><em>Aaaber</em>: Wie leicht aus dem Ausgangspost herauszulesen ist, geht es hier nicht um die Lösung eines bestimmten Problems, sondern um die Chancen und Risiken eines bestimmten (durch die Sprache erlaubten) Konstrukts.<br />
Das ist wie die Frage &quot;Wie funktioniert eigentlich eine Einspritzpumpe am Auto?&quot;<br />
Man muss ja keine Lust haben, sich mit dieser Frage zu beschäftigen, aber einfach zu sagen: &quot;Wo willst Du denn hin?&quot; - beantwortet weder die Frage, noch hilft sie sonst weiter.<br />
Natürlich kann man sagen: &quot;Brauchst Du nicht zu wissen!&quot; (was vielleicht sogar stimmt) ... aber das hat Neugierde zum Glück noch nie aufhalten oder abwerten können.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714509</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sat, 23 May 2009 08:58:09 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Sat, 23 May 2009 09:59:23 GMT]]></title><description><![CDATA[<p>Ging jetzt auch nicht speziell um diesen Thread. Sicher gibts einige die erst mal nach dem eigentlichen Problem fragen, aber die die komplizierte Lösungen posten sind meisten mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714526</guid><dc:creator><![CDATA[hmmmm?]]></dc:creator><pubDate>Sat, 23 May 2009 09:59:23 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Sat, 23 May 2009 11:07:46 GMT]]></title><description><![CDATA[<p>hmmmm? schrieb:</p>
<blockquote>
<p>Ging jetzt auch nicht speziell um diesen Thread. Sicher gibts einige die erst mal nach dem eigentlichen Problem fragen, aber die die komplizierte Lösungen posten sind meisten mehr.</p>
</blockquote>
<p>Es gibt halt viele Wege etwas zu lösen und das sieht man dann auch hier. Sei doch froh, dass sich viele hier die Mühe machen lange über ein Problem, Lösungen und dessen Folgen zu machen. Oftmals hilft das möglicherweise wirklich nicht direkt zu dem eigentlichem Problem, aber man kann andersweitig davon profitieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714545</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 23 May 2009 11:07:46 GMT</pubDate></item><item><title><![CDATA[Reply to Eigenes Objekt löschen on Sun, 24 May 2009 01:21:32 GMT]]></title><description><![CDATA[<p>Ob man nun &quot;delete this;&quot; schreibt, oder &quot;delete obj;&quot; in einer Free-Function, ist doch im Endeffekt egal.<br />
Bei intrusive reference counting (wurde ja schon als Beispiel gebracht) setze ich persönlich z.B. grundsätzlich Memberfunktionen ein. Und das führt automatisch zu einem &quot;delete this;&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1714798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1714798</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 24 May 2009 01:21:32 GMT</pubDate></item></channel></rss>