<?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[Löschen der Klasse aus einer Funktion]]></title><description><![CDATA[<pre><code class="language-cpp">void foo::crashMe(bar* f)
{
	f-&gt;DoSomething(this);
	cout &lt;&lt; &quot;Hello still here&quot; &lt;&lt; endl;
}

void bar::DoSomething(foo* f)
{
	delete f; f= NULL;
}

int main()
{
	foo* f = new foo;
	bar* b = new bar;
	f-&gt;crashMe(b);
	delete f;
}
</code></pre>
<p>Hab dieses kleine Codeconstruct &quot;erfunden&quot; als ich einige Crashes im Debugger nachstellen wollte.<br />
Das lustige:<br />
Unter Visual Studio kompiliert bleibt das Programm stehen und die Konsole hängt sich auf.<br />
Mit dem gcc kompiliert funktioniert es.<br />
Was sagt denn hier der Standard dazu? Ist das das, was man undefiniertes Verhalten nennt?<br />
Die Ausgabe findet aber noch statt.<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/269869/löschen-der-klasse-aus-einer-funktion</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 21:16:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269869.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 02 Jul 2010 11:57:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 11:58:16 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void foo::crashMe(bar* f)
{
	f-&gt;DoSomething(this);
	cout &lt;&lt; &quot;Hello still here&quot; &lt;&lt; endl;
}

void bar::DoSomething(foo* f)
{
	delete f; f= NULL;
}

int main()
{
	foo* f = new foo;
	bar* b = new bar;
	f-&gt;crashMe(b);
	delete f;
}
</code></pre>
<p>Hab dieses kleine Codeconstruct &quot;erfunden&quot; als ich einige Crashes im Debugger nachstellen wollte.<br />
Das lustige:<br />
Unter Visual Studio kompiliert bleibt das Programm stehen und die Konsole hängt sich auf.<br />
Mit dem gcc kompiliert funktioniert es.<br />
Was sagt denn hier der Standard dazu? Ist das das, was man undefiniertes Verhalten nennt?<br />
Die Ausgabe findet aber noch statt.<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920408</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 11:58:16 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 12:01:23 GMT]]></title><description><![CDATA[<p>Scorcher24 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void foo::crashMe(bar* f)
{
	f-&gt;DoSomething(this);
	cout &lt;&lt; &quot;Hello still here&quot; &lt;&lt; endl;
}

void bar::DoSomething(foo* f)
{
	delete f; f= NULL;
}

int main()
{
	foo* f = new foo;
	bar* b = new bar;
	f-&gt;crashMe(b);
	delete f;
}
</code></pre>
<p>Hab dieses kleine Codeconstruct &quot;erfunden&quot; als ich einige Crashes im Debugger nachstellen wollte.<br />
Das lustige:<br />
Unter Visual Studio kompiliert bleibt das Programm stehen und die Konsole hängt sich auf.<br />
Mit dem gcc kompiliert funktioniert es.<br />
Was sagt denn hier der Standard dazu? Ist das das, was man undefiniertes Verhalten nennt?<br />
Die Ausgabe findet aber noch statt.<br />
rya.</p>
</blockquote>
<p>Zweifaches delete -&gt; undefiniertes Verhalten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920413</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 12:01:23 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 12:06:32 GMT]]></title><description><![CDATA[<p>Däng sollte delete b; heissen -.-. Ok gut :D. Meine Blödheit.</p>
<p>Aber warum funktioniert es trotzdem? Der Deconstructor wird vor der Ausgabe ausgeführt.<br />
Weil es in dem Moment schon auf dem Stack liegt? Ist dieses Verhalten garantiert?<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920415</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 12:06:32 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 12:08:11 GMT]]></title><description><![CDATA[<p>Scorcher24 schrieb:</p>
<blockquote>
<p>Däng sollte delete b; heissen -.-. Ok gut :D. Meine Blödheit.</p>
<p>Aber warum funktioniert es trotzdem? Der Deconstructor wird vor der Ausgabe ausgeführt.<br />
Weil es in dem Moment schon auf dem Stack liegt? Ist dieses Verhalten garantiert?<br />
rya.</p>
</blockquote>
<p>Außerdem kannst mir den Zweck von</p>
<pre><code class="language-cpp">f= NULL;
</code></pre>
<p>noch erklären <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/1920417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920417</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 12:08:11 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 12:11:34 GMT]]></title><description><![CDATA[<p>Scorcher24 schrieb:</p>
<blockquote>
<p>Däng sollte delete b; heissen -.-. Ok gut :D. Meine Blödheit.</p>
<p>Aber warum funktioniert es trotzdem? Der Deconstructor wird vor der Ausgabe ausgeführt.<br />
Weil es in dem Moment schon auf dem Stack liegt? Ist dieses Verhalten garantiert?<br />
rya.</p>
</blockquote>
<p>Ich vermute mal, weil intern der <strong>Destruktor</strong> aufgerufen wird (also nicht delete) und dann per free der Speicherbereich freigegeben wird.</p>
<p>Nur eine Vermutung!<br />
Und sicherlich ist zweite Aufruf des <strong>Destruktors</strong> nicht garantiert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920421</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 12:11:34 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 12:12:08 GMT]]></title><description><![CDATA[<p>Scorcher24 schrieb:</p>
<blockquote>
<p>Aber warum funktioniert es trotzdem? Der Deconstructor wird vor der Ausgabe ausgeführt.<br />
Weil es in dem Moment schon auf dem Stack liegt? Ist dieses Verhalten garantiert?</p>
</blockquote>
<p>Nein, wie schon gesagt undefiniertes Verhalten. Abgesehen davon heisst es &quot;Destruktor&quot; und nicht &quot;Deconstructor&quot;. <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/1920422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920422</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 02 Jul 2010 12:12:08 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 12:12:50 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Außerdem kannst mir den Zweck von</p>
<pre><code class="language-cpp">f= NULL;
</code></pre>
<p>noch erklären <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>
<pre><code class="language-cpp">delete f; f=NULL;
</code></pre>
<p>bedeutet</p>
<pre><code class="language-cpp">delete f; assert(&quot;Bin Anfänger&quot;);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1920424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920424</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 02 Jul 2010 12:12:50 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 12:15:48 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>CSpille schrieb:</p>
<blockquote>
<p>Außerdem kannst mir den Zweck von</p>
<pre><code class="language-cpp">f= NULL;
</code></pre>
<p>noch erklären <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>
<pre><code class="language-cpp">delete f; f=NULL;
</code></pre>
<p>bedeutet</p>
<pre><code class="language-cpp">delete f; assert(&quot;Bin Anfänger&quot;);
</code></pre>
</blockquote>
<p>wxWidgets, Datei defs.h:</p>
<pre><code class="language-cpp">// delete pointer if it is not NULL and NULL it afterwards
    template &lt;typename T&gt;
    inline void wxDELETE(T*&amp; ptr)
    {
        typedef char TypeIsCompleteCheck[sizeof(T)];

        if ( ptr != NULL )
        {
            delete ptr;
            ptr = NULL;
        }
    }
</code></pre>
<p>Warum mach ich das und auch andere wie man sieht? Damit der nächste Test auf NULL für den Zeiger auch funktioniert... wird in einigen Tutorials aufgeführt und habs auch schon in Büchern gesehen.<br />
Ausserdem schon selber Crashes gehabt, weil ein Test eines Zeigers auf NULL ohne diesen Zusatz nicht funktioniert hat.<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920428</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 12:15:48 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 12:17:14 GMT]]></title><description><![CDATA[<p>Scorcher24 schrieb:</p>
<blockquote>
<p>Warum mach ich das und auch andere wie man sieht? Damit der nächste Test auf NULL für den Zeiger auch funktioniert... wird in einigen Tutorials aufgeführt und habs auch schon in Büchern gesehen</p>
</blockquote>
<p>Achte mal ganz genau auf den Parametertypen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920430</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 02 Jul 2010 12:17:14 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 12:20:19 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">if ( ptr != NULL )
        {
            delete ptr;
</code></pre>
<p>... macht auch schon nicht viel Sinn die Abfrage.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920431</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 02 Jul 2010 12:20:19 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 12:21:53 GMT]]></title><description><![CDATA[<p>Scorcher24 schrieb:</p>
<blockquote>
<p>wxWidgets, Datei defs.h:</p>
<pre><code class="language-cpp">// delete pointer if it is not NULL and NULL it afterwards
    template &lt;typename T&gt;
    inline void wxDELETE(T*&amp; ptr)
    {
        typedef char TypeIsCompleteCheck[sizeof(T)];

        if ( ptr != NULL )
        {
            delete ptr;
            ptr = NULL;
        }
    }
</code></pre>
</blockquote>
<p>Abgesehen davon, dass das eine Referenz ist und bei dir nicht, zeigt schon das <code>if(ptr != NULL)</code> , dass hier nicht unbedingt ein C++-Kenner gewerkelt hat <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/1920434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920434</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Fri, 02 Jul 2010 12:21:53 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 12:27:33 GMT]]></title><description><![CDATA[<p>Scorcher24 schrieb:</p>
<blockquote>
<p>Warum mach ich das und auch andere wie man sieht?</p>
</blockquote>
<p>Schlechte Bücher und Tutorials. Übergib sie der reinigenden Kraft des Feuers.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920438</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 02 Jul 2010 12:27:33 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 12:50:15 GMT]]></title><description><![CDATA[<p>Scorcher24 schrieb:</p>
<blockquote>
<p>Warum mach ich das und auch andere wie man sieht?</p>
</blockquote>
<p>Als kleines Beispiel für die Anmerkungen der vorherigen Beiträge:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class A {
public:
};

void delPtrRef(A*&amp; a){
        delete a;
        a = 0;
        std::cout &lt;&lt; a &lt;&lt; std::endl;
}

void delPtr(A* a){
        delete a;
        a = 0;
        std::cout &lt;&lt; a &lt;&lt; std::endl;
}

int main()
{
        A* a = new A();
        delPtr(a);
        std::cout &lt;&lt; a &lt;&lt; std::endl;
        a = new A();
        delPtrRef(a);
        std::cout &lt;&lt; a &lt;&lt; std::endl;
}
</code></pre>
<pre><code>0
0x100100080
0
0
</code></pre>
<p>EDIT: unnötige includes raus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920452</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 12:50:15 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 12:53:51 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Scorcher24 schrieb:</p>
<blockquote>
<p>Warum mach ich das und auch andere wie man sieht?</p>
</blockquote>
<p>Schlechte Bücher und Tutorials. Übergib sie der reinigenden Kraft des Feuers.</p>
</blockquote>
<p>Hast du generell etwas gegen die Übergabe von Referenzen auf Pointer oder<br />
hast du ohne genau hinzukucken das Beispiel als äquivalent eingestuft<br />
oder ging es dir um das if(ptr!=NULL) ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920456</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 12:53:51 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 13:22:13 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Scorcher24 schrieb:</p>
<blockquote>
<p>Warum mach ich das und auch andere wie man sieht?</p>
</blockquote>
<p>Schlechte Bücher und Tutorials. Übergib sie der reinigenden Kraft des Feuers.</p>
</blockquote>
<p>Hast du generell etwas gegen die Übergabe von Referenzen auf Pointer oder<br />
hast du ohne genau hinzukucken das Beispiel als äquivalent eingestuft<br />
oder ging es dir um das if(ptr!=NULL) ?</p>
</blockquote>
<p>Es ging mir um das NULL-setzen nach delete AKA safeDelete. Das ist keine gute Idee. Praxisfern. Hilft nur gegen Fehler, die man später garantiert nicht mehr macht. Zu jedem new gehört ein delete. Allein bei dem Versuch, dafür zu sorgen, daß man nicht kein delete hat, löst man das viel leichtere Problem, nicht zwei deletes zu haben, im Vorübergehen.</p>
<p>Egal, wie es implementiert wird,<br />
mit Zeiger auf Zeiger <a href="http://www.narnio.com/2007/08/17/c-safedelete-explaind/" rel="nofollow">http://www.narnio.com/2007/08/17/c-safedelete-explaind/</a><br />
mit Referenz und Template <a href="http://www.cpp-home.com/tutorials/48_1.htm" rel="nofollow">http://www.cpp-home.com/tutorials/48_1.htm</a><br />
als Makro <a href="http://www.koders.com/c/fidF7333B272B02D9402A130F96603177E8E912E3C9.aspx?s=cdef%3Atree" rel="nofollow">http://www.koders.com/c/fidF7333B272B02D9402A130F96603177E8E912E3C9.aspx?s=cdef%3Atree</a><br />
oder wieauchimmer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920462</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 02 Jul 2010 13:22:13 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 14:07:57 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Das ist keine gute Idee. Praxisfern.</p>
</blockquote>
<p>okay...<br />
Dann mal nen Praxisbeispiel, wo ich sowas z.B. verwenden würde:<br />
Ein ganz einfacher binärer Baum (mit vielen binären Knoten)<br />
Wenn ich jetzt ein Element in einen Knoten einfügen wollte, würde ich<br />
z.B.</p>
<pre><code class="language-cpp">right = new Node(inhalt);
</code></pre>
<p>machen</p>
<p>Später möchte ich diesen Eintrag wieder entfernen.<br />
Dann mach ich:</p>
<pre><code class="language-cpp">delete right;
right = 0;
</code></pre>
<p>so garantiere ich, dass mein Destruktor mit</p>
<pre><code class="language-cpp">delete right;
delete left;
</code></pre>
<p>funktioniert.</p>
<p>Würdest du in so einem Fall anders vorgehen oder siehst du es als 'Ausnahme'</p>
<p>Fällt mir gerade auf... Ich hätte auch ne lineare Liste nehmen können <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>volkard schrieb:</p>
<blockquote>
<p>Zu jedem new gehört ein delete.</p>
</blockquote>
<p>Aber generell gebe ich dir da absolut recht!<br />
<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>
]]></description><link>https://www.c-plusplus.net/forum/post/1920472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920472</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 14:07:57 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 14:28:09 GMT]]></title><description><![CDATA[<p>Du hast anscheinend übersehen das in dem Code-Beispiel das er kritisiert hat eine lokale Kopie eines Pointers auf 0 gesetzt wird...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920489</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 02 Jul 2010 14:28:09 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 14:29:56 GMT]]></title><description><![CDATA[<p>Natürlich gibt es Fälle, wo man Zeiger nach dem Freigeben auf Null setzt. Doch wenn man kein Containerbastler ist, tritt das meines Erachtens eher weniger auf. Ich weiss nicht, wann ich sowas das letzte Mal benötigt habe. Selbst ein selbstgeschriebenes <code>delete</code> ausserhalb einer Smart-Pointer-Implementierung ist schon länger her.</p>
<p>Ich meine nur, dass ein</p>
<pre><code class="language-cpp">scoped_ptr&lt;T&gt; ptr(new T(1));
ptr.reset(new T(2));
</code></pre>
<p>tausendmal sicherer ist als jedes noch so &quot;safe&quot; <code>delete</code> . Und in der Regel sollte man im Anwendungscode zu Smart-Pointern tendieren, wenn überhaupt Zeiger benötigt werden (was oft nicht nötig ist).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920493</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 02 Jul 2010 14:29:56 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 14:31:19 GMT]]></title><description><![CDATA[<p>Hab noch nie Smart-Pointer etc. verwendet. Gab noch nie Probleme. Wobei der Code auf über 15 Jahre alt ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920494</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 02 Jul 2010 14:31:19 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 14:34:37 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Du hast anscheinend übersehen das in dem Code-Beispiel das er kritisiert hat eine lokale Kopie eines Pointers auf 0 gesetzt wird...</p>
</blockquote>
<p>Ich denke er meinte das wxWidgets-Beispiel, oder?</p>
<p>Das mit der lokalen Kopie hab ich gesehen:</p>
<p>CSpille schrieb:</p>
<blockquote>
<p>Außerdem kannst mir den Zweck von</p>
<pre><code class="language-cpp">f= NULL;
</code></pre>
<p>noch erklären <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1920497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920497</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 14:34:37 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 14:47:22 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Hab noch nie Smart-Pointer etc. verwendet. Gab noch nie Probleme. Wobei der Code auf über 15 Jahre alt ist...</p>
</blockquote>
<p>Du meinst, du hast noch keine Probleme entdeckt. <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>Natürlich geht es auch ohne Smart-Pointer, sieht man ja an C. Aber es wird bei komplexeren Situationen relativ lästig, besonders wenn Exceptions oder mehrere Ablaufpfade hinzukommen.</p>
<p>Wie löst du das? Das ist jetzt nicht einmal ein gekünsteltes Beispiel, sondern kommt ziemlich ähnlich bei mir vor. Und das Beispiel ist noch eher einfach, da alles nach dem selben Muster abläuft. Die Membervariablen sind momentan vom Typ <code>scoped_ptr</code> mit dem entsprechenden Zeigertypen. Die Ressourcen werfen im Konstruktor eine Exception, falls sie nicht geladen werden können.</p>
<pre><code class="language-cpp">void MyClass::LoadResources()
{
    myGraphics.reset( new GraphicResource() ); // Lädt alle Grafiken
    myAudio.reset( new AudioResource() ); // Lädt alle Sounds
    myFonts.reset( new FontResource() ); // Lädt alle Schriftarten
    myData.reset( new DataResource() ); // Lädt sonstige Daten
}
</code></pre>
<p>Du hast fast immer mehr und komplexeren Code, wenn du solche Probleme äquivalent ohne RAII lösen möchtest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920500</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 02 Jul 2010 14:47:22 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 14:52:04 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ich meine nur, dass ein</p>
<pre><code class="language-cpp">scoped_ptr&lt;T&gt; ptr(new T(1));
ptr.reset(new T(2));
</code></pre>
<p>tausendmal sicherer ist als jedes noch so &quot;safe&quot; <code>delete</code> . Und in der Regel sollte man im Anwendungscode zu Smart-Pointern tendieren, wenn überhaupt Zeiger benötigt werden (was oft nicht nötig ist).</p>
</blockquote>
<p>Machst du in deine Klassen eigentlich scoped_ptr&lt;T&gt; statt normale Pointer?<br />
Also wo ich mir nie so die Gedanken drüber gemacht habe, was mir gerade auffällt:<br />
Mir war ja klar, dass man im Konstruktor alles selbst aufräumen muss, falls eine<br />
Exception fliegt. (passiert ja relativ selten ^^ - Ich weiß: falsche Einstellung)<br />
Wenn man jetzt zwei Objekte auf dem Heap anlegt und beim zweiten eine bad_alloc<br />
fliegt, dann hat man ja ein memory leak...<br />
Wenn man stattdessen einen scoped_ptr verwendet jedoch nicht...</p>
<p>DANKE Nexus!</p>
<p>Ohne deine (erneute) <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="😉"
    /> Smart-Pointer Befürwortung wäre mir das wohl jetzt<br />
nicht aufgefallen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920505</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 14:52:04 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 15:07:37 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Würdest du in so einem Fall anders vorgehen oder siehst du es als 'Ausnahme'</p>
</blockquote>
<p>Ich sehe das als einen ganz anderen Fall. Hier ist die Liste so definiert, daß der letzte Zeiger 0 enthält und man daran das Ende erkennt.</p>
<p>Mir fiel auf, daß Du im Baum Code zwei Zeilen</p>
<p>CSpille schrieb:</p>
<blockquote>
<pre><code class="language-cpp">delete right;
right = 0;
</code></pre>
</blockquote>
<p>geschrieben hast.</p>
<p>frei nach CSpille schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void removeLast()
{//ungetestet
  Node** last=&amp;first;
  while((*last)-&gt;next!=0)
    last=&amp;(last-&gt;next);
  delete last;
  last=0;
}
</code></pre>
</blockquote>
<p>recht lustig schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void removeLast()
{//ungetestet
  Node** last=&amp;first;
  while((*last)-&gt;next!=0)
    last=&amp;(last-&gt;next);
  safeDelete(last);//oder wxDELETE(last);
}
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1920507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920507</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 02 Jul 2010 15:07:37 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 14:57:37 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Machst du in deine Klassen eigentlich scoped_ptr&lt;T&gt; statt normale Pointer?</p>
</blockquote>
<p>Nicht <code>scoped_ptr</code> statt normalen Zeigern, sondern <code>scoped_ptr</code> statt besitz-an-sich-reissenden, nicht-teilenden Zeigern. <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>Wenn der Zeiger lediglich ein Verweis auf andere Daten ist, nehme ich natürlich keinen Smart-Pointer. Es gibt z.B. auch ab und zu den Fall, in dem ich einen Zeiger tief kopieren möchte. Da leider Boost und auch die Standardbibliothek nichts dergleichen bieten und Lokis Implementierung auch nur begrenzt weiterhilft, habe ich mir selbst entsprechende Smart-Pointer geschrieben, die in ihrem Kopierkonstruktor das Objekt kopieren, die virtuelle <code>Clone()</code> -Funktion aufrufen oder sonst was tun...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920510</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 02 Jul 2010 14:57:37 GMT</pubDate></item><item><title><![CDATA[Reply to Löschen der Klasse aus einer Funktion on Fri, 02 Jul 2010 15:39:21 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Ich sehe das als einen ganz anderen Fall. Hier ist die Liste so definiert, daß der letzte Zeiger 0 enthält und man daran das Ende erkennt.</p>
</blockquote>
<p>Sehr gut...<br />
Deine Kritik ging also gegen 'unüberlegtes' präventives setzen auf 0,<br />
quasi als 'Allerheilmittel' für fehlende Zuordnung der Löschverantwortung</p>
<p>thx!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1920522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1920522</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 02 Jul 2010 15:39:21 GMT</pubDate></item></channel></rss>