<?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[Wie verhalten sich Exceptions im Konstruktor?]]></title><description><![CDATA[<p>So, ich hab jetzt folgende Klasse:</p>
<pre><code class="language-cpp">class Example
{
	public:
	Example()
	: much_memory(new int[10000]), even_more_memory(new int[1000000]);
	{
		if(something_failed())
			throw std::exception(&quot;the class is fucked up, canceling further construction...&quot;);

		// much more code
		allocated_later = new int[100];
	}

	~Example()
	{
		delete[] much_memory;
		delete[] even_more_memory;
		delete[] allocated_later;
	}

	private:
	int* much_memory;
	int* even_more_memory;
	int* allocated_later;
};
</code></pre>
<p>Ich hab erst kürzlich von RAII gelesen. Das Schlüsselkonzept dabei ist ja, dass Ressourcen bei der Erzeugung eines Objekt allokiert werden, und bei der Zerstörung wieder freigegeben. Hier wird aber eine Exception im Konstruktur geworfen, nachdem bereits einiges an Speicher allokiert wurde. Das Objekt ist noch nicht ganz erzeugt, beim Wurf der Exception ist allocted_later z.B. noch nicht initialisiert, der Destruktur würde also einen Fehler verursachen. Was passiert hier genau, wie wird das gehandhabt?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/211202/wie-verhalten-sich-exceptions-im-konstruktor</link><generator>RSS for Node</generator><lastBuildDate>Tue, 13 Oct 2026 21:53:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/211202.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 20 Apr 2008 12:54:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie verhalten sich Exceptions im Konstruktor? on Sun, 20 Apr 2008 12:54:44 GMT]]></title><description><![CDATA[<p>So, ich hab jetzt folgende Klasse:</p>
<pre><code class="language-cpp">class Example
{
	public:
	Example()
	: much_memory(new int[10000]), even_more_memory(new int[1000000]);
	{
		if(something_failed())
			throw std::exception(&quot;the class is fucked up, canceling further construction...&quot;);

		// much more code
		allocated_later = new int[100];
	}

	~Example()
	{
		delete[] much_memory;
		delete[] even_more_memory;
		delete[] allocated_later;
	}

	private:
	int* much_memory;
	int* even_more_memory;
	int* allocated_later;
};
</code></pre>
<p>Ich hab erst kürzlich von RAII gelesen. Das Schlüsselkonzept dabei ist ja, dass Ressourcen bei der Erzeugung eines Objekt allokiert werden, und bei der Zerstörung wieder freigegeben. Hier wird aber eine Exception im Konstruktur geworfen, nachdem bereits einiges an Speicher allokiert wurde. Das Objekt ist noch nicht ganz erzeugt, beim Wurf der Exception ist allocted_later z.B. noch nicht initialisiert, der Destruktur würde also einen Fehler verursachen. Was passiert hier genau, wie wird das gehandhabt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1495035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1495035</guid><dc:creator><![CDATA[Exceptional]]></dc:creator><pubDate>Sun, 20 Apr 2008 12:54:44 GMT</pubDate></item><item><title><![CDATA[Reply to Wie verhalten sich Exceptions im Konstruktor? on Sun, 20 Apr 2008 13:06:36 GMT]]></title><description><![CDATA[<p>Den Speicher sollte man ebenfalls immer via RAII allokieren also z.B. auto_ptr oder ähnliches benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1495042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1495042</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Sun, 20 Apr 2008 13:06:36 GMT</pubDate></item><item><title><![CDATA[Reply to Wie verhalten sich Exceptions im Konstruktor? on Sun, 20 Apr 2008 16:46:23 GMT]]></title><description><![CDATA[<p>der destruktor wird niemals aufgerufen, da ein objekt, das nicht fertig erzeugt wurde, gar nie existiert hat.<br />
deshalb die auto_ptr (oder welche smart-pointer dir auch immer angenehm sind), pro ressource ein wrapper.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1495183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1495183</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Sun, 20 Apr 2008 16:46:23 GMT</pubDate></item><item><title><![CDATA[Reply to Wie verhalten sich Exceptions im Konstruktor? on Sun, 20 Apr 2008 16:57:54 GMT]]></title><description><![CDATA[<p>Ein (nicht-POD) Klassenobjekt lebt, nachdem sein Konstruktor normal beendet wurde. Wird ein Konstruktor vorzeitig wegen einer Exception verlassen, werden alle bis dahin konstruierten Klassensubobjekte (also Basisklassen, nicht-statische Member, Arrayelemente) in umgekehrter Reihenfolge ihrer Konstruktion zerstört (nicht aber eben der Destruktor der Klasse selbst, der verlässt sich ja schließlich darauf, dass die Klasse in allen ihren Teilen normal lebt). Anschließend wird, falls das zu konstruierende Objekt dynamisch per new erstellt werden sollte, die zum operator new passende Deallokationsfunktion operator delete aufgerufen (falls es eine gibt, dies ist der einzige Fall, in der eine placement-delete-Funktion zum Einsatz kommt). Normale Zeiger sind keine Klassen und folglich wird bei deren Zerstörung nichts getan, an dieser Stelle hättest du also ein potentielles Speicherleck. Zum exceptionsicheren RAII gehört also nicht nur die Resourcenallokation im Konstruktor, es bedeutet auch, dass jede Klasse, die unmittelbar mit Resourcenmanagement zu tun hat, nur genau eine Resource alloziert und man sich dann dieser Hilfsklassen (wenn die Resource einfach Speicher ist, wäre das ein geeigneter Smartpointer, hier ist scoped_array die einfachste Lösung) in der uns eigentlich interessierenden Klasse bedient.</p>
<p>P.S. Es ist möglich, das Obige ohne RAII exceptionsicher zu machen, das ist dann aber außerordentlich umständlich und hässlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1495188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1495188</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 20 Apr 2008 16:57:54 GMT</pubDate></item><item><title><![CDATA[Reply to Wie verhalten sich Exceptions im Konstruktor? on Sun, 20 Apr 2008 17:06:41 GMT]]></title><description><![CDATA[<p>ach, ein hiweis an den OP auf die &quot;law of the big three&quot; sei hier auch noch angebracht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1495193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1495193</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Sun, 20 Apr 2008 17:06:41 GMT</pubDate></item></channel></rss>