<?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[Von Konstruktoren, Destruktoren und Suizid-Objekten]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich habe eine Klasse, die in ihrem Konstruktor diverse Handles vom System beantragt und anderweitige Ressourcen belegt. Jetzt kann es passieren, dass beim allokieren dieser Ressourcen es zu einem Fehler kommt und damit die gesamte Instanz der Klasse unbrauchbar wird. Ich muss also alle belegten Ressourcen wieder frei geben und den Konstruktor abbrechen (über throw Exception).</p>
<p>Nun habe ich allerdings das Problem, dass der Aufrufende Code ein Objekt hat, dass effektiv eine Leiche ist, da es alle Ressourcen wieder frei gegeben hat.</p>
<p>Stellt sich für mich die Frage, ob man folgendes machen sollte / darf / kann / muss:</p>
<pre><code class="language-cpp">CMyClass::CMyClass(void)
{
   this-&gt;GetLotsOfSystemRessources();
   if (this-&gt;m_bFatalErrorFlag)
   {
      this-&gt;ReleaseLotsOfSystemRessources();
      delete this;
      throw EFatalException(EFatalException::ERR_ALLOC_SYS_RES)
   }
}
</code></pre>
<p>Wenn ich soetwas vermeiden sollte, wie kann ich sonst sicher gehen, dass mein Objekt und seine Kumpels nicht irgendwo &quot;Day of Living Dead X&quot; drehen? Oder ist einfach der aufrufende Code nach abfangen des Fehlers für das freigeben des Objektes zuständig?</p>
<p>Grüße,<br />
Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/227431/von-konstruktoren-destruktoren-und-suizid-objekten</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 03:19:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/227431.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 15 Nov 2008 02:37:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Von Konstruktoren, Destruktoren und Suizid-Objekten on Sat, 15 Nov 2008 02:37:28 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich habe eine Klasse, die in ihrem Konstruktor diverse Handles vom System beantragt und anderweitige Ressourcen belegt. Jetzt kann es passieren, dass beim allokieren dieser Ressourcen es zu einem Fehler kommt und damit die gesamte Instanz der Klasse unbrauchbar wird. Ich muss also alle belegten Ressourcen wieder frei geben und den Konstruktor abbrechen (über throw Exception).</p>
<p>Nun habe ich allerdings das Problem, dass der Aufrufende Code ein Objekt hat, dass effektiv eine Leiche ist, da es alle Ressourcen wieder frei gegeben hat.</p>
<p>Stellt sich für mich die Frage, ob man folgendes machen sollte / darf / kann / muss:</p>
<pre><code class="language-cpp">CMyClass::CMyClass(void)
{
   this-&gt;GetLotsOfSystemRessources();
   if (this-&gt;m_bFatalErrorFlag)
   {
      this-&gt;ReleaseLotsOfSystemRessources();
      delete this;
      throw EFatalException(EFatalException::ERR_ALLOC_SYS_RES)
   }
}
</code></pre>
<p>Wenn ich soetwas vermeiden sollte, wie kann ich sonst sicher gehen, dass mein Objekt und seine Kumpels nicht irgendwo &quot;Day of Living Dead X&quot; drehen? Oder ist einfach der aufrufende Code nach abfangen des Fehlers für das freigeben des Objektes zuständig?</p>
<p>Grüße,<br />
Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1614981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1614981</guid><dc:creator><![CDATA[ip]]></dc:creator><pubDate>Sat, 15 Nov 2008 02:37:28 GMT</pubDate></item><item><title><![CDATA[Reply to Von Konstruktoren, Destruktoren und Suizid-Objekten on Sat, 15 Nov 2008 03:17:37 GMT]]></title><description><![CDATA[<p>schonmal von RAII gehört? (bzw. RRID)?</p>
<p><a href="http://en.wikipedia.org/wiki/RAII" rel="nofollow">http://en.wikipedia.org/wiki/RAII</a><br />
ausführlich: <a href="http://www.hackcraft.net/raii/" rel="nofollow">http://www.hackcraft.net/raii/</a></p>
<p>delete this im konstruktor ist übrigens *nie* notwendig, das geschieht automatisch (ohne aufruf des destruktors, da ja noch gar kein fertiges objekt existiert), soll heißen der speicher wird (sofern normal angefordert) automatisch freigegeben. nur um deine resourcen musst du dich selbst kümmern (also filehandles, sockets, whatever) - und zwar mit RAII</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1614983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1614983</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Sat, 15 Nov 2008 03:17:37 GMT</pubDate></item><item><title><![CDATA[Reply to Von Konstruktoren, Destruktoren und Suizid-Objekten on Sat, 15 Nov 2008 10:16:02 GMT]]></title><description><![CDATA[<p>Ok, cool. Dann hat das Kind ja auch einen Namen. Das habe ich schon oft benutzt weil es einfach und intuitiv ist. Aber so ein schöner Fachbegriff... <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>Also, um das Konzept kurz zu erläutern:<br />
Man sorgt dafür, dass die Allokation von Ressourcen bei der Initialisierung einer Klasse erfolgt und die Freigabe dann automatisch im Destruktor vorgenommen wird.</p>
<p>In deinem Fall ungefähr so:</p>
<pre><code class="language-cpp">class CMyClass
{
public:
	// Konstruktor: Allokation und Fehlerüberprüfung
	CMyClass()
	{
	   GetLotsOfSystemRessources();

	   if (this-&gt;m_bFatalErrorFlag)
	      throw EFatalException(EFatalException::ERR_ALLOC_SYS_RES);
	} 

	// Destruktor: Ressourcenfreigabe
	~CMyClass()
	{
	   ReleaseLotsOfSystemRessources();
	} 

	// Optional je nach Anwendung zusätzlich: Vorzeitige Ressourcenfreigabe.
	// Achtung: erfordert dann aber bei jeder Ressourcenbenutzung
	// eine Gültigkeitsprüfung!
	close()
	{
	   ReleaseLotsOfSystemRessources();
	} 

	// Vielleicht auch sowas
	reopen()
	{
	   ReleaseLotsOfSystemRessources();
	   GetLotsOfSystemRessources();
	} 
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1615017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1615017</guid><dc:creator><![CDATA[Wirdbald]]></dc:creator><pubDate>Sat, 15 Nov 2008 10:16:02 GMT</pubDate></item><item><title><![CDATA[Reply to Von Konstruktoren, Destruktoren und Suizid-Objekten on Sat, 15 Nov 2008 12:33:37 GMT]]></title><description><![CDATA[<p>Das wie du es da machst, wird nicht funktionieren, weil der Destruktor nur <strong>für vollständig konstruierte Objekte</strong>, für die der Konstruktor also <strong>keine Exception geworfen hat</strong> aufgerufen wird.</p>
<p>EDIT: Stattdessen könnte man für jede einzelne Ressource ein einzelnes Teilobjekt verwenden. Denn für teilweise konstruierte Objekte wird der Destruktor für alle schon konstruierten Teilobjekte aufgerufen. Das heißt, wenn eine Allokation (oder was auch immer) fehlschlägt, kann dann eine Excpetion geworfen werden, so dass <strong>automatisch</strong> alle schon erzeugten Subobjekte sauber zerstört werden.</p>
<p>Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1615063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1615063</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Sat, 15 Nov 2008 12:33:37 GMT</pubDate></item><item><title><![CDATA[Reply to Von Konstruktoren, Destruktoren und Suizid-Objekten on Sat, 15 Nov 2008 14:44:30 GMT]]></title><description><![CDATA[<p>sicher funktioniert das so, wenn CMyClass in dem beispiel eben nur für die ressource &quot;GetLotsOfSystemRessources&quot; zuständig ist.<br />
die exception darf natürlich nur geworfen werden, wenn GetLotsOfSystemRessources fehlschlägt, d.h. wenn GetLotsOfSystemRessources *keine* ressource zurückgibt - denn dann muss auch nichts wieder freigegeben werden. CMyClass darf dann klarerweise auch *nur* für diese ressource zuständig sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1615117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1615117</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Sat, 15 Nov 2008 14:44:30 GMT</pubDate></item></channel></rss>