<?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[Frage zu Exceptions]]></title><description><![CDATA[<p>Hi,</p>
<p>wenn eine Exception geworfen wurde, und ich diese zum Beispiel in einer Funktion meiner Klasse fange, und mit <code>throw;</code> weiterreiche, damit ich sie nach main() bekomme, weil ich dort alle Exceptions behandeln will, muss ich dann den Speicher den ich in der Klasse mit new reserviert habe, manuell freigeben?</p>
<p>Meine Klasse hat zwar einen Dekstruktor, der alles macht, aber wird der auch bei einer Exception korrekt ausgeführt?</p>
<p>Vielen Dank <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/topic/246889/frage-zu-exceptions</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 20:45:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246889.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 03 Aug 2009 10:39:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Exceptions on Mon, 03 Aug 2009 10:39:26 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wenn eine Exception geworfen wurde, und ich diese zum Beispiel in einer Funktion meiner Klasse fange, und mit <code>throw;</code> weiterreiche, damit ich sie nach main() bekomme, weil ich dort alle Exceptions behandeln will, muss ich dann den Speicher den ich in der Klasse mit new reserviert habe, manuell freigeben?</p>
<p>Meine Klasse hat zwar einen Dekstruktor, der alles macht, aber wird der auch bei einer Exception korrekt ausgeführt?</p>
<p>Vielen Dank <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/1754443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754443</guid><dc:creator><![CDATA[asdasdasd]]></dc:creator><pubDate>Mon, 03 Aug 2009 10:39:26 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Exceptions on Mon, 03 Aug 2009 10:54:29 GMT]]></title><description><![CDATA[<p>Beim Hochreichen von Exceptions wird der Stack korrekt aufgeräumt. Das heißt insbesondere, dass für lokale Objekte alle Destruktoren auf dem Weg nach oben aufgerufen werden. Wenn ich deine Frage richtig verstanden habe, solltest du also keine Probleme haben.</p>
<pre><code class="language-cpp">int main() {

   try {
      foo();
   }
   catch(...) {
      // ...
   }
   return 0;
}

void foo() {

   MyClass myObj;
   bar();
}

void bar() {

   AnotherClass *anotherObj = new AnotherClass;
   baz();
}

void baz() {

   throw &quot;ERROR!&quot;;
}
</code></pre>
<p>Im Beispiel wird myObj korrekt abgeräumt - inklusive Dtor-Aufruf. Das mit new() erzeugte anotherObj wird allerdings ohne weitere Maßnahmen nicht geöscht, da es nicht auf dem Stack liegt.</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754452</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Mon, 03 Aug 2009 10:54:29 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Exceptions on Mon, 03 Aug 2009 11:08:01 GMT]]></title><description><![CDATA[<p>DStefan schrieb:</p>
<blockquote>
<p>Beim Hochreichen von Exceptions wird der Stack korrekt aufgeräumt. Das heißt insbesondere, dass für lokale Objekte alle Destruktoren auf dem Weg nach oben aufgerufen werden. Wenn ich deine Frage richtig verstanden habe, solltest du also keine Probleme haben.</p>
<pre><code class="language-cpp">int main() {

   try {
      foo();
   }
   catch(...) {
      // ...
   }
   return 0;
}

void foo() {

   MyClass myObj;
   bar();
}

void bar() {

   AnotherClass *anotherObj = new AnotherClass;
   baz();
}

void baz() {

   throw &quot;ERROR!&quot;;
}
</code></pre>
<p>Im Beispiel wird myObj korrekt abgeräumt - inklusive Dtor-Aufruf. Das mit new() erzeugte anotherObj wird allerdings ohne weitere Maßnahmen nicht geöscht, da es nicht auf dem Stack liegt.</p>
<p>Stefan.</p>
</blockquote>
<p>So etwas meine ich:</p>
<pre><code class="language-cpp">class MyClass
{
 private:
  int *x;

 public:
  MyClass() 
  { 
   x = new int[1024];  // new[] (!)
   throw &quot;...&quot;; 
  }

  ~MyClass() 
  { 
   delete[] x; // delete[] (!) Wird es aufgerufen?
  }
};

int main()
{
 try
 {
  MyClass foobar; // Wird der Speicher korrekt freigegeben???
 }
 catch (...)
 {
  // ...
 }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1754462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754462</guid><dc:creator><![CDATA[asdasdasd]]></dc:creator><pubDate>Mon, 03 Aug 2009 11:08:01 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Exceptions on Mon, 03 Aug 2009 11:14:34 GMT]]></title><description><![CDATA[<blockquote>
<p>wenn eine Exception geworfen wurde, und ich diese zum Beispiel in einer Funktion meiner Klasse fange, und mit throw; weiterreiche, damit ich sie nach main() bekomme, weil ich dort alle Exceptions behandeln will</p>
</blockquote>
<p>Du brauchst sie nicht fangen, damit sie nach oben mittels throw weitergereicht wird. Sie propagiert bis zu dem catch, das sie faengt automatisch. Und ja, der Destruktor wird fuer Objekte auf dem Stack aufgerufen. Wie das bei Exceptions ist, die innerhalb eines Konsturktors auftreten, weiss ich nicht. Versuche solche Situationen zu vermeiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754463</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 03 Aug 2009 11:14:34 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Exceptions on Mon, 03 Aug 2009 11:18:03 GMT]]></title><description><![CDATA[<p>asdasdasd schrieb:</p>
<blockquote>
<p>So etwas meine ich:</p>
<pre><code class="language-cpp">class MyClass
{
 private:
  int *x;

 public:
  MyClass() 
  { 
   x = new int[1024];  // new[] (!)
   throw &quot;...&quot;; 
  }
</code></pre>
</blockquote>
<p>Wenn in der Funktion, in der eine Exception fliegen kann, etwas mit new angefordert wird, muss die exception gefangen werden und das &quot;etwas&quot; mit delete freigegeben werden. Der Destruktor wird hier nicht aufgerufen, weil der Konstruktor nie ordnungsgemäß verlassen wurde und daher das Objekt nie wirklich existiert hat. Die Member sind zwar alle konstruiert worden, aber nach der Philosophie von C++ beginnt die Lebenszeit eines Objekts erst mit dem (ordnungsgemäßen) Verlassen eines Konstruktors.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754467</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 03 Aug 2009 11:18:03 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Exceptions on Mon, 03 Aug 2009 12:35:05 GMT]]></title><description><![CDATA[<p>asdasdasd schrieb:</p>
<blockquote>
<p>So etwas meine ich:</p>
<pre><code class="language-cpp">class MyClass
{
 private:
  int *x;

 public:
  MyClass() 
  { 
   x = new int[1024];  // new[] (!)
   throw &quot;...&quot;; 
  }

  ~MyClass() 
  { 
   delete[] x; // delete[] (!) Wird es aufgerufen?
  }
};

int main()
{
 try
 {
  MyClass foobar; // Wird der Speicher korrekt freigegeben???
 }
 catch (...)
 {
  // ...
 }
}
</code></pre>
</blockquote>
<p>Wie schon gesagt, der Destruktor wird nicht aufgerufen, weil das Objekt nicht erfolgreich &quot;konstruiert&quot; wurde.</p>
<p>In Deinem Falle würde ich einen Vector als Objekt-Element nehmen. Auch, wenn dann der Konstruktor von MyClass eine Exception schmeißt, werden die Objekt-Elemente ordnungsgemäß wieder zerstört (der Speicher, den der Vektor reserviert hatte, wird wieder freigegeben). Es ist also sehr sinvoll, möglichst nur eine Resource in einem Objekt zu kapseln und ein &quot;größeres&quot; Objekt aus mehreren &quot;kleinen&quot; zusammenzusetzen.</p>
<p>Sonst sollte man noch die <a href="http://de.wikipedia.org/wiki/Dreierregel_(C%2B%2B)" rel="nofollow">Dreierregel</a> beachten. Man darf nicht vergessen, dass der Compiler versucht, einen Copy-C'tor und einen Copy-Assignment-Operator automatisch hinzuzufügen, falls die Objekt-Elemente das erlauben.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754508</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 03 Aug 2009 12:35:05 GMT</pubDate></item></channel></rss>