<?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[Matrix Template: Wieso wird Destruktor zweimal aufgerufen???]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich will eine kleine Matrix-Klasse schreiben.<br />
Die sieht bisher ungefähr so aus (noch recht rudimentär):</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class CMatrix
{
private:
	T** fmatrix;	
	const int fzeilen;
	const int fspalten;

public:
	//Konstruktoren
	CMatrix()
	{
	}

	CMatrix(const int &amp; azeilen, const int &amp; aspalten):fzeilen(azeilen), fspalten(aspalten)
	{
	   //zweidimensionales Array erzeugen
	   fmatrix = new T *[azeilen]; 
	   for(int i=0; i &lt; azeilen; i++)
	   fmatrix[i] = new T[aspalten];
	}

	//Destruktor
	virtual ~CMatrix()
	{
	   cout &lt;&lt; &quot;Aufruf Destruktor!&quot; &lt;&lt; endl;
	   for (int i = 0; i &lt; fzeilen ; i++)
	      delete fmatrix[i] ;
	   delete fmatrix; 
	}
};
</code></pre>
<p>Das Hauptprogramm dazu:</p>
<pre><code class="language-cpp">#include &quot;matrix.h&quot;

int main(int argc, char* argv[])
{
   try
   {
      CMatrix&lt;double&gt; testmatrix(3,4);
      testmatrix.~CMatrix();
      return 0;
   }
   catch(CFehler &amp; fehler)
   {
      fehler.ausgabe();
   }

}
</code></pre>
<p>Ich bekomme einen Fehler, das Programm bricht ab. Interesannterweise beim ZWEITEN Durchlauf des Destruktors!<br />
Wenn ich den try-catch Block entferne, wird der Destruktor auch zweimal aufgerufen, aber das Programm bricht nicht mit einem Fehler ab <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Wieso wird überhaupt der Destruktor zweimal aufgerufen???</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/129012/matrix-template-wieso-wird-destruktor-zweimal-aufgerufen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 01:42:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/129012.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Dec 2005 11:32:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Matrix Template: Wieso wird Destruktor zweimal aufgerufen??? on Fri, 09 Dec 2005 11:32:49 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich will eine kleine Matrix-Klasse schreiben.<br />
Die sieht bisher ungefähr so aus (noch recht rudimentär):</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class CMatrix
{
private:
	T** fmatrix;	
	const int fzeilen;
	const int fspalten;

public:
	//Konstruktoren
	CMatrix()
	{
	}

	CMatrix(const int &amp; azeilen, const int &amp; aspalten):fzeilen(azeilen), fspalten(aspalten)
	{
	   //zweidimensionales Array erzeugen
	   fmatrix = new T *[azeilen]; 
	   for(int i=0; i &lt; azeilen; i++)
	   fmatrix[i] = new T[aspalten];
	}

	//Destruktor
	virtual ~CMatrix()
	{
	   cout &lt;&lt; &quot;Aufruf Destruktor!&quot; &lt;&lt; endl;
	   for (int i = 0; i &lt; fzeilen ; i++)
	      delete fmatrix[i] ;
	   delete fmatrix; 
	}
};
</code></pre>
<p>Das Hauptprogramm dazu:</p>
<pre><code class="language-cpp">#include &quot;matrix.h&quot;

int main(int argc, char* argv[])
{
   try
   {
      CMatrix&lt;double&gt; testmatrix(3,4);
      testmatrix.~CMatrix();
      return 0;
   }
   catch(CFehler &amp; fehler)
   {
      fehler.ausgabe();
   }

}
</code></pre>
<p>Ich bekomme einen Fehler, das Programm bricht ab. Interesannterweise beim ZWEITEN Durchlauf des Destruktors!<br />
Wenn ich den try-catch Block entferne, wird der Destruktor auch zweimal aufgerufen, aber das Programm bricht nicht mit einem Fehler ab <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Wieso wird überhaupt der Destruktor zweimal aufgerufen???</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/938027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/938027</guid><dc:creator><![CDATA[KeineAhnung78]]></dc:creator><pubDate>Fri, 09 Dec 2005 11:32:49 GMT</pubDate></item><item><title><![CDATA[Reply to Matrix Template: Wieso wird Destruktor zweimal aufgerufen??? on Fri, 09 Dec 2005 11:46:23 GMT]]></title><description><![CDATA[<blockquote>
<p>Wieso wird überhaupt der Destruktor zweimal aufgerufen???</p>
</blockquote>
<p>Weil testmatrix ein automatisches Objekt ist und du den Destruktor einmal explizit aufrufst.</p>
<p>Du musst Destruktoren sogut wie nie explizit aufrufen (die Ausnahme ist für dich im Moment wohl noch uninteressant). C++ tut dies automatisch, wenn die Gültigkeit eines Objekts endet.</p>
<p>Was du hingegen nicht vergessen darfst ist der Aufruf von delete, wenn du ein Objekt zuvor mit new angelegt hast.</p>
<p>PS: Du solltest dringend nochmal das Kapitel &quot;Gültigkeit/Lebensdauer von Objekten&quot; im C++ Einsteigerbuch deiner Wahl nachlesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/938041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/938041</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Fri, 09 Dec 2005 11:46:23 GMT</pubDate></item><item><title><![CDATA[Reply to Matrix Template: Wieso wird Destruktor zweimal aufgerufen??? on Fri, 09 Dec 2005 12:10:06 GMT]]></title><description><![CDATA[<p>HumeSikkins schrieb:</p>
<blockquote>
<p>(die Ausnahme ist für dich im Moment wohl noch uninteressant)</p>
</blockquote>
<p>Das interessiert mich jetzt aber doch sehr :). Was ist denn die Ausnahme? Hat<br />
das was mit der Zerstoerung von Singletons zu tun, oder hab ich da grad was<br />
falsch im Kopf?</p>
<p>mfg<br />
v R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/938068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/938068</guid><dc:creator><![CDATA[vR@uni]]></dc:creator><pubDate>Fri, 09 Dec 2005 12:10:06 GMT</pubDate></item><item><title><![CDATA[Reply to Matrix Template: Wieso wird Destruktor zweimal aufgerufen??? on Fri, 09 Dec 2005 12:12:08 GMT]]></title><description><![CDATA[<p>Ja danke, ist logisch. Mein C++ ist ein wenig eingerostet, stelle ich gerade fest! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/938070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/938070</guid><dc:creator><![CDATA[KeineAhnung78]]></dc:creator><pubDate>Fri, 09 Dec 2005 12:12:08 GMT</pubDate></item><item><title><![CDATA[Reply to Matrix Template: Wieso wird Destruktor zweimal aufgerufen??? on Fri, 09 Dec 2005 12:43:48 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10104">@KeineAhnung78</a><br />
Dein Destruktor funktioniert eh nicht korrekt, so löscht man Arrays:</p>
<pre><code class="language-cpp">//Destruktor
    virtual ~CMatrix()
    {
       cout &lt;&lt; &quot;Aufruf Destruktor!&quot; &lt;&lt; endl;
       for (int i = 0; i &lt; fzeilen ; i++)
          delete [] fmatrix[i];  //EDIT: Jetzt aber
       delete [] fmatrix;  //Du löschst immerhin ein Array
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/938071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/938071</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Fri, 09 Dec 2005 12:43:48 GMT</pubDate></item><item><title><![CDATA[Reply to Matrix Template: Wieso wird Destruktor zweimal aufgerufen??? on Fri, 09 Dec 2005 12:20:14 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>//Du löschst immerhin ein Array</p>
</blockquote>
<p>Das gilt aber auch für die Teilarrays -&gt; &quot;delete[] fmatrix[i];&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/938084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/938084</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 09 Dec 2005 12:20:14 GMT</pubDate></item><item><title><![CDATA[Reply to Matrix Template: Wieso wird Destruktor zweimal aufgerufen??? on Fri, 09 Dec 2005 12:36:17 GMT]]></title><description><![CDATA[<p>Danke <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/938094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/938094</guid><dc:creator><![CDATA[KeineAhnung78]]></dc:creator><pubDate>Fri, 09 Dec 2005 12:36:17 GMT</pubDate></item><item><title><![CDATA[Reply to Matrix Template: Wieso wird Destruktor zweimal aufgerufen??? on Fri, 09 Dec 2005 13:19:25 GMT]]></title><description><![CDATA[<p>vR@uni schrieb:</p>
<blockquote>
<p>HumeSikkins schrieb:</p>
<blockquote>
<p>(die Ausnahme ist für dich im Moment wohl noch uninteressant)</p>
</blockquote>
<p>Das interessiert mich jetzt aber doch sehr :). Was ist denn die Ausnahme? Hat<br />
das was mit der Zerstoerung von Singletons zu tun, oder hab ich da grad was<br />
falsch im Kopf?</p>
<p>mfg<br />
v R</p>
</blockquote>
<p>Die Ausnahme, die mir in diesem Zusammenhang einfällt, ist placement new.<br />
D.h. bei folgenden Code muss explizit der Dtor aufgerufen werden:</p>
<pre><code class="language-cpp">class Foo
{
   ...
};

int main()
{
    void* raw_data = malloc(sizeof(Foo));
    Foo *obj = new (raw_data) Foo();

    // ...

    obj-&gt;~Foo();
    free(raw_data);
}
</code></pre>
<p>Ein Aufruf von Operator delete hätte hier fatale Folgen...</p>
<p>Gruß Caipi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/938134</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/938134</guid><dc:creator><![CDATA[Caipi]]></dc:creator><pubDate>Fri, 09 Dec 2005 13:19:25 GMT</pubDate></item></channel></rss>