<?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[&amp;quot;delete this&amp;quot; - legal?]]></title><description><![CDATA[<p>Hi.<br />
Ist folgendes, exemplarisches Beispiel nach C++ Standard legal?</p>
<pre><code class="language-cpp">class XManager
{
public:
    X *Open();
};

class X
{
public:
    ~X()
    {
        // sind hier noch alle Membervariablen, etc. valid?
    }
    void Bla()
    {
        // ...
    }
    void Close()
    {
        delete this;
    }
};

// ...
XManager *Man = new XManager;

// ...
X *y = Man-&gt;Open();
y-&gt;Bla();
y-&gt;Close(); // ab hier wäre y nicht mehr valid
</code></pre>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/266289/quot-delete-this-quot-legal</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 08:19:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/266289.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 May 2010 17:51:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Thu, 06 May 2010 17:51:40 GMT]]></title><description><![CDATA[<p>Hi.<br />
Ist folgendes, exemplarisches Beispiel nach C++ Standard legal?</p>
<pre><code class="language-cpp">class XManager
{
public:
    X *Open();
};

class X
{
public:
    ~X()
    {
        // sind hier noch alle Membervariablen, etc. valid?
    }
    void Bla()
    {
        // ...
    }
    void Close()
    {
        delete this;
    }
};

// ...
XManager *Man = new XManager;

// ...
X *y = Man-&gt;Open();
y-&gt;Bla();
y-&gt;Close(); // ab hier wäre y nicht mehr valid
</code></pre>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893445</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Thu, 06 May 2010 17:51:40 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Thu, 06 May 2010 17:58:31 GMT]]></title><description><![CDATA[<p>Legal ja, ob sinnvoll mag ein anderes Thema sein. Wenn Du die Klasse komplett verriegelst, daß niemand sonst irgendwie Objekte löschen kann außer mit Close, ist das zumindest in Deinem Kontext sicher.</p>
<p>Zur Frage im Code: im Destruktor sind alle Member noch gültig, ja.</p>
<p>Siehe auch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-228857.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-228857.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893446</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893446</guid><dc:creator><![CDATA[Marc++us]]></dc:creator><pubDate>Thu, 06 May 2010 17:58:31 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Thu, 06 May 2010 20:15:33 GMT]]></title><description><![CDATA[<p>Marc++us schrieb:</p>
<blockquote>
<p>Legal ja, ob sinnvoll mag ein anderes Thema sein...</p>
</blockquote>
<p>Es gibt Sonderfälle in denen es sinnvoll ist, aber es ist wirklich die Ausnahme, nicht die Regel.</p>
<p>lului schrieb:</p>
<blockquote>
<p>nein.</p>
</blockquote>
<p>Dann solltest du mal erwähnen warum nicht, wie gesagt gibt es sogar Fälle in denen dies durchaus gemacht wird (wenn auch sehr selten).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893511</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 06 May 2010 20:15:33 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 15:37:22 GMT]]></title><description><![CDATA[<p>Und was ist, wenn einer ganz ahnungslos</p>
<pre><code class="language-cpp">X myx;
myx.Close();
</code></pre>
<p>in seinem Code schreibt und sich wundert, dass das Objekt doppelt gelöscht wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893857</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Fri, 07 May 2010 15:37:22 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 15:39:46 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p>Und was ist, wenn einer ganz ahnungslos</p>
<pre><code class="language-cpp">X myx;
myx.Close();
</code></pre>
<p>in seinem Code schreibt und sich wundert, dass das Objekt doppelt gelöscht wird?</p>
</blockquote>
<p>Dann ist &quot;Wenn Du die Klasse komplett verriegelst, daß niemand sonst irgendwie Objekte löschen kann außer mit Close&quot; nicht erfüllt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893863</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 07 May 2010 15:39:46 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 16:22:15 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>wxSkip schrieb:</p>
<blockquote>
<p>Und was ist, wenn einer ganz ahnungslos</p>
<pre><code class="language-cpp">X myx;
myx.Close();
</code></pre>
<p>in seinem Code schreibt und sich wundert, dass das Objekt doppelt gelöscht wird?</p>
</blockquote>
<p>Dann ist &quot;Wenn Du die Klasse komplett verriegelst, daß niemand sonst irgendwie Objekte löschen kann außer mit Close&quot; nicht erfüllt.</p>
</blockquote>
<p>Danke, das hatte ich überlesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893905</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Fri, 07 May 2010 16:22:15 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 20:24:19 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p>Und was ist, wenn einer ganz ahnungslos</p>
<pre><code class="language-cpp">X myx;
myx.Close();
</code></pre>
<p>in seinem Code schreibt und sich wundert, dass das Objekt doppelt gelöscht wird?</p>
</blockquote>
<p>Wie gesagt, das war ein Beispiel. Die Klasse ist abstrakt, kann also nicht instanziert werden. Dieser Fehler ist also ausgeschlossen.</p>
<p>Natürlich bleibt noch folgender Fehler:</p>
<pre><code class="language-cpp">X *y = Man-&gt;Open();
X-&gt;Close();
X-&gt;Bla(); // crash
</code></pre>
<p>Aber in der Dokumentation steht das dick und fett drin - und ist beabsichtigt und in diesem Fall auch sinnvoll.</p>
<p>Gruß und Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893992</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Fri, 07 May 2010 20:24:19 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 20:29:28 GMT]]></title><description><![CDATA[<p>Mich würde aus reiner Neugier interessieren, wieso du dies als nötig erachtest. Ich kenne verdammt wenige bis gar keine Fälle, wo sowas nötig ist. Wäre also froh, wenn ich meinen Horizont erweitern könnte <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>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893994</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 07 May 2010 20:29:28 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 20:31:33 GMT]]></title><description><![CDATA[<p>Normalerweise fängt so eine &quot;delete this&quot;-Klasse einen privaten Destruktor. Das verhindert für Fremde sowohl lokale und globale Objekte als auch das Zerstören mit delete.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893996</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 07 May 2010 20:31:33 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 20:34:33 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Mich würde aus reiner Neugier interessieren, wieso du dies als nötig erachtest. Ich kenne verdammt wenige bis gar keine Fälle, wo sowas nötig ist. Wäre also froh, wenn ich meinen Horizont erweitern könnte <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>
</blockquote>
<p>Man schickt dem Fenster halt ein Close und manche gehen daraufhin in den Untergrund, manche tun gar nichts, die meisten aber sind brav und verschwinden per delete this.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1893998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1893998</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 07 May 2010 20:34:33 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 20:38:36 GMT]]></title><description><![CDATA[<p>Ist aber schlechter Stil. Wenn ein Fenster gelöscht werden soll, dann würde ich auch sagen das es gelöscht werden soll. Wenn ich ein Fenster nur schließen will, rufe ich eine Schließ-Funktion auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894000</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Fri, 07 May 2010 20:38:36 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 20:47:28 GMT]]></title><description><![CDATA[<p>Ich zweifle gerade ein wenig daran, daß Du hier von Stil reden solltest, Janjan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894002</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 07 May 2010 20:47:28 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 20:48:32 GMT]]></title><description><![CDATA[<p>Das ist schön für dich. Eine Funktion sollte das tun, was ihr Name bereits beschreibt. Close() sollte etwas schließen, nicht löschen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894003</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Fri, 07 May 2010 20:48:32 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 20:59:14 GMT]]></title><description><![CDATA[<p><a href="http://www.stedwards.edu/it_dept/competency/Images/XP%20OS%20graphics/window.gif" rel="nofollow">Close</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894010</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 07 May 2010 20:59:14 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 21:03:50 GMT]]></title><description><![CDATA[<p>Und? Was hat das mit dem Thema zu tun? Richtig, gar nichts.</p>
<p>Es ist nicht unüblich das Programm zu beenden, wenn alle Fenster <strong>geschlossen</strong> wurden. Aber sonst sollte eine Schließ-Funktion nur das tun: Schließen. Denn man könnte das Fenster ja wieder öffnen wollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894011</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Fri, 07 May 2010 21:03:50 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 21:08:27 GMT]]></title><description><![CDATA[<p>Janjan schrieb:</p>
<blockquote>
<p>Und? Was hat das mit dem Thema zu tun? Richtig, gar nichts.</p>
</blockquote>
<p>Doch. Wenn Du ganz tief nachdenkst, kannst Du zu dem Schluß kommen, daß Close normalerweise auch bewirkt, daß das Fenster gelöscht wird. Und genau das kann man mit delete this machen. Umwege der Art, tote Fenster erst in eine Löschliste einzutragen und alle paar Sekunden die Löschliste abzuarbeiten, sind eher Umwege und sollten nicht bloß aus stilistischen Überlegungen gewählt werden, zumal man mit Zombie-Fenstern dann noch peinliche Resourcenkonflikte mit Nachfolgenden provoziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894017</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 07 May 2010 21:08:27 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 21:14:20 GMT]]></title><description><![CDATA[<p>Dem stimme ich eben schlichtweg nicht zu. Das verhindert das wiederbenutzen von Fenstern. Sinnvoller wäre dann eher eine Funktion wie closeAndDelete() - die macht dann auch das, was der Bezeichner bereits aussagt. Dazu eben eine normale close()-Funktion, die das Fenster nur schließt.</p>
<p>Und Zombie-Fenster und Resourcenkonflikte entstehen keineswegs dadurch. Man kann das Fenster ja nach wie vor selbst löschen, wenn es notwendig - und vor allem gewollt - ist.</p>
<pre><code class="language-cpp">wnd-&gt;close();
delete wnd;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1894019</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894019</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Fri, 07 May 2010 21:14:20 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 21:15:46 GMT]]></title><description><![CDATA[<p>Ok. Ein philosophisches Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894021</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894021</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 07 May 2010 21:15:46 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 21:15:47 GMT]]></title><description><![CDATA[<p>Wenn ihr es unbedingt wissen wollt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<pre><code class="language-cpp">URL *x = URLManager-&gt;Open(&quot;bla.de&quot;);
std::string source = x-&gt;Read();
x-&gt;Close();
// ist schöner als URLManager-&gt;Close(x);
</code></pre>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894022</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Fri, 07 May 2010 21:15:47 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 21:17:49 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Janjan schrieb:</p>
<blockquote>
<p>Und? Was hat das mit dem Thema zu tun? Richtig, gar nichts.</p>
</blockquote>
<p>Doch. Wenn Du ganz tief nachdenkst, kannst Du zu dem Schluß kommen, daß Close normalerweise auch bewirkt, daß das Fenster gelöscht wird. Und genau das kann man mit delete this machen. Umwege der Art, tote Fenster erst in eine Löschliste einzutragen und alle paar Sekunden die Löschliste abzuarbeiten, sind eher Umwege und sollten nicht bloß aus stilistischen Überlegungen gewählt werden, zumal man mit Zombie-Fenstern dann noch peinliche Resourcenkonflikte mit Nachfolgenden provoziert.</p>
</blockquote>
<p>Also ich schliesse oft die Fenster, frage DANACH noch Werte daraus ab und zerstöre es dann erst. Das hat den Effekt, dass der User das Gefühl hat, dass sein Interface deutlich besser reagiert. Zudem möchte ich die Möglichkeit haben, ein Fenster auf dem Stack zu erstellen, zum Beispiel für einen kurzen modalen Dialog. Genau dieses &quot;delete this&quot; Verhalten, welches zum Teil auch wxWidgets implementiert, finde ich katastrophal! Ich will selber die Kontrolle haben, wann ein Fenster seine Ressourcen freigibt.</p>
<p>Auch musst du dann ständig mit Zeigern herumhantieren. Du kannst keine Fenster als Member einer Klasse definieren, sondern kannst in der Klasse nur Zeiger auf diese halten.</p>
<p>Nein, gerade für Fenster ist sowas der völlig falsche Weg und ist nur unnötig einschränkend.</p>
<p>theliquidwave schrieb:</p>
<blockquote>
<p>Wenn ihr es unbedingt wissen wollt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<pre><code class="language-cpp">URL *x = URLManager-&gt;Open(&quot;bla.de&quot;);
std::string source = x-&gt;Read();
x-&gt;Close();
// ist schöner als URLManager-&gt;Close(x);
</code></pre>
<p>Gruß</p>
</blockquote>
<p>Hä? Wieso kein auto_ptr, shared_ptr oder sonst was in der Art? Wieso keine Kopie? Wieso kein Handler? Wieso überhaupt URLManager? ... Also da stellen sich eine Menge an Fragen <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894025</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 07 May 2010 21:17:49 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 21:19:47 GMT]]></title><description><![CDATA[<p>Weil URL eine abstrakte Klasse ist die nicht instanziert werden kann (Plugins...).</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894028</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Fri, 07 May 2010 21:19:47 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 21:22:28 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Weil URL eine abstrakte Klasse ist die nicht instanziert werden kann (Plugins...).</p>
</blockquote>
<p>Und? Kannst du ein kleines bisschen genauer werden?<br />
Wir haben schliesslich nicht dein Wissen vom dem Konstrukt, daher muss du das schon ein wenig genauer erklären, damit wir es verstehen können. Einfach zwei Stichwörter hinzuschmeissen reicht da nicht sehr weit <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894030</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 07 May 2010 21:22:28 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 21:28:55 GMT]]></title><description><![CDATA[<p>Also...<br />
...das ganze kommt daher, dass ich verschiedene Managerklassen habe (so mein bisheriges Konzept). Jede Managerklasse wird vom Programm instanziert und via GetProcAddress / dlsym wird dann später der Pointer zu diesen Klassen geholt (jede Instanz einer Managerklasse gibt es nur einmal im Programm, alle Plugins greifen auf diese zu). Da ich vermeiden möchte, dass ich ewig den Sourcecode mitgeben muss, habe ich alle Klassen, die man verwenden kann, abstrakt gemacht. Man kann diese also nur via Managerklasse instanzieren (lassen). So brauche ich den Sourcecode zu einer Headerdatei nicht immer preisgeben / die Pluginautoren müssen nicht ewig den ganzen Sourecode neukompilieren. Es wäre auch &quot;dumm&quot; wenn jeder Pluginautor den Sourcecode ändert um andere Ergebnisse zu erzielen - die Konsistenz würde einfach verloren gehen.</p>
<p>All diese Probleme kann ich mit den Managerklassen lösen. Und da ich ja immerhin Speicher auf dem Heap zurückgebe, würde es einen Memoryleak geben, wenn man die Klasse nicht via <code>Close()</code> oder ähnlichem löscht.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894036</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Fri, 07 May 2010 21:28:55 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 21:44:11 GMT]]></title><description><![CDATA[<p>Die Managerklasse habe ich nicht zu 100% verstanden, aber da scheint wohl einen tieferen Sinn dahinter zu stecken. Wo ich allerdings mühe habe, ist bei diesem Satz:</p>
<blockquote>
<p>Und da ich ja immerhin Speicher auf dem Heap zurückgebe, würde es einen Memoryleak geben, wenn man die Klasse nicht via Close() oder ähnlichem löscht.</p>
</blockquote>
<p>Es gibt da deutlich bessere möglichkeiten. Zum Beispiel im aktuellen Standard enthalten ist der <code>auto_ptr</code> .</p>
<pre><code class="language-cpp">std::auto_ptr&lt;int&gt; createSomething()
{
  return std::auto_ptr&lt;int&gt;(new int(3923));
}

int main()
{
  createSomething();
  return 0;
}
</code></pre>
<p>Dieser Code hat kein Memory Leak. <code>auto_ptr</code> gehört zu den sogenannten Smart Pointern. Davon gibt es einige und auch deutlich bessere als <code>auto_ptr</code> . Boost bietet zum Beispiel die üblichen an:<br />
<a href="http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/smart_ptr.htm" rel="nofollow">http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/smart_ptr.htm</a></p>
<p>Das praktische an solchen Smart Pointern ist auch die Sicherheit bei Exceptions, da du dich dann an das RAII Konzept hälst. Nehmen wir zum Beispiel deinen Code:</p>
<pre><code class="language-cpp">URL *x = URLManager-&gt;Open(&quot;bla.de&quot;);
std::string source = x-&gt;Read();
evil_function();
x-&gt;Close();
</code></pre>
<p>Wenn <code>evil_function</code> eine Exception wirft, wird nie <code>Close</code> aufgerufen und du hast ein Memory Leak. Mit einem Smart Pointer wäre dies nicht passiert, da er bei seiner Zerstörung automatich den Speicher freigegeben hätte. Also zum Beispiel mit <code>auto_ptr</code> :</p>
<pre><code class="language-cpp">std::auto_ptr&lt;URL&gt; x = URLManager-&gt;Open(&quot;bla.de&quot;);
std::string source = x-&gt;Read();
evil_function();
</code></pre>
<p>Dies macht keine Probleme, wenn evil_function eine Exception wirft. <code>x</code> wird per <code>delete</code> trotzdem freigegeben.</p>
<p>Man kann auch eigene Smart Pointer Klassen schreiben, welche zusätzlichen spezialisierten Code bei der Zerstörung ausführen. Die Boost Smart Pointer können zum Beispiel bei der Erstellung eine Zerstörungsfunktion übernehmen, welche beim Löschen aufgerufen wird.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894042</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 07 May 2010 21:44:11 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 21:50:16 GMT]]></title><description><![CDATA[<p>Wie Genial ist das denn? Ich kannte die Teile gar nicht. Für meinen Fall scheinen die echt sinnvoll zu sein. Danke für den Tipp <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Eine Frage dazu habe ich aber noch. Was ist, wenn folgendes passiert?</p>
<pre><code class="language-cpp">std::auto_ptr&lt;URL*&gt; x = URLManager-&gt;Open(&quot;bla.de&quot;);
x-&gt;Bla();
x-&gt;Close(); // delete this
</code></pre>
<p>Würde der auto_ptr dann nicht versuchen, ein nicht mehr existierendes Objekt zu löschen, was in einem Crash enden würde?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894045</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Fri, 07 May 2010 21:50:16 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;delete this&amp;quot; - legal? on Fri, 07 May 2010 21:55:24 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Würde der auto_ptr dann nicht versuchen, ein nicht mehr existierendes Objekt zu löschen, was in einem Crash enden würde?</p>
</blockquote>
<p>Genau, daher weg mit der <code>Close</code> Funktion. Die ist ja nun unnötig, nicht? Und es ist übrigens <code>std::auto_ptr&lt;URL&gt;</code> (ohne Sternchen) <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1894049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1894049</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 07 May 2010 21:55:24 GMT</pubDate></item></channel></rss>