<?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[Aufruf von Destruktoren bei Exception]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe zwei etwas speziellere Fragen zum Aufruf von Destruktoren bzw. stack unwinding beim Werfen von Exceptions. Gegeben sei folgender Code:</p>
<pre><code class="language-cpp">try
{
    A a;
    B b(a); // a wird als Member von b gespeichert

    b.foo();
}
catch(...)
{
    cerr &lt;&lt; &quot;Fehler&quot;;
}
</code></pre>
<p>1. Was passiert, wenn foo() eine Exception wirft? Wird dann der Destruktor erst für a als Member von b und dann ein weiteres Mal für a als lokale Variable im try-Block aufgerufen?</p>
<p>2. Was passiert, wenn bereits der Konstruktur von b eine Exception wirft? Der Destruktor von b wird dann schon einmal nicht aufgerufen, soviel weiß ich bereits, aber was ist mit dem von a?</p>
<p>Mich interessiert vor allem die genaue Reihenfolge von Destruktoraufrufen und Ausführung des catch-Blocks. Ich hoffe, dass man das anhand des Beispiels überhaupt sicher sagen kann, ansonsten müssten noch weitere Angaben gemacht werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274903/aufruf-von-destruktoren-bei-exception</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 06:22:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274903.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 05 Oct 2010 09:34:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Aufruf von Destruktoren bei Exception on Tue, 05 Oct 2010 09:34:54 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe zwei etwas speziellere Fragen zum Aufruf von Destruktoren bzw. stack unwinding beim Werfen von Exceptions. Gegeben sei folgender Code:</p>
<pre><code class="language-cpp">try
{
    A a;
    B b(a); // a wird als Member von b gespeichert

    b.foo();
}
catch(...)
{
    cerr &lt;&lt; &quot;Fehler&quot;;
}
</code></pre>
<p>1. Was passiert, wenn foo() eine Exception wirft? Wird dann der Destruktor erst für a als Member von b und dann ein weiteres Mal für a als lokale Variable im try-Block aufgerufen?</p>
<p>2. Was passiert, wenn bereits der Konstruktur von b eine Exception wirft? Der Destruktor von b wird dann schon einmal nicht aufgerufen, soviel weiß ich bereits, aber was ist mit dem von a?</p>
<p>Mich interessiert vor allem die genaue Reihenfolge von Destruktoraufrufen und Ausführung des catch-Blocks. Ich hoffe, dass man das anhand des Beispiels überhaupt sicher sagen kann, ansonsten müssten noch weitere Angaben gemacht werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1961529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1961529</guid><dc:creator><![CDATA[ph4nt0m]]></dc:creator><pubDate>Tue, 05 Oct 2010 09:34:54 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf von Destruktoren bei Exception on Tue, 05 Oct 2010 11:34:50 GMT]]></title><description><![CDATA[<blockquote>
<p>2. Was passiert, wenn bereits der Konstruktur von b eine Exception wirft? Der Destruktor von b wird dann schon einmal nicht aufgerufen, soviel weiß ich bereits, aber was ist mit dem von a?</p>
</blockquote>
<p>der von a wird aufgerufen, da a schon konstruiert wurde.</p>
<blockquote>
<p>1. Was passiert, wenn foo() eine Exception wirft? Wird dann der Destruktor erst für a als Member von b und dann ein weiteres Mal für a als lokale Variable im try-Block aufgerufen?</p>
</blockquote>
<p>ja, A::~A wird 2x ausgeführt, wenn B ein A beinhaltet (dann wurde es im CTor ja kopiert). Wenn A nur eine Referenz oder einen Pointer hält, wird der DTor logischerweise nur einmal aufgerufen.</p>
<p>Reihenfolge, wenn foo wirft (editiert - da war ich wohl nicht recht bei der sache^^):</p>
<pre><code>foo()

B::~B
{
  A::~A
  {}
}
A::~A
{}
</code></pre>
<p>wenn es an dem bsp noch nicht klar wurde:<br />
(die zu erst erstellten Objekte werden zu letzt zerstört)<br />
gegeben sei:</p>
<pre><code class="language-cpp">class A
{
  A()  {std::cout &lt;&lt; &quot;A::A()&quot; &lt;&lt; std::endl;}
  ~A() {std::cout &lt;&lt; &quot;A::~A()&quot; &lt;&lt; std::endl;}
};
class B
{
  B()  {std::cout &lt;&lt; &quot;B::B()&quot; &lt;&lt; std::endl;}
  ~B() {std::cout &lt;&lt; &quot;B::~B()&quot; &lt;&lt; std::endl;}
};
class C
{
  C()  {std::cout &lt;&lt; &quot;C::C()&quot; &lt;&lt; std::endl;}
  ~C() {std::cout &lt;&lt; &quot;C::~C()&quot; &lt;&lt; std::endl;}
};
</code></pre>
<p>anwendung:</p>
<pre><code class="language-cpp">void foo()
{
  std::cout &lt;&lt; &quot;foo()&quot; &lt;&lt; std::endl;

  throw 0;
  /*unreachable code*/
}

int main()
{
  try
  {
    A a;
    B b;
    C c;

    foo();
  }
  catch(...)
  {
    std::cerr &lt;&lt; &quot;cought&quot; &lt;&lt; std::endl;
  }
}
</code></pre>
<p>ausgabe wäre:</p>
<pre><code>A::A()
B::B()
C::C()
foo()
C::~C()
B::~B()
A::~A()
cought
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1961544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1961544</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 05 Oct 2010 11:34:50 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf von Destruktoren bei Exception on Tue, 05 Oct 2010 11:06:10 GMT]]></title><description><![CDATA[<p>Danke, das macht die ganze Sache schon wesentlich klarer <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="🙂"
    /> Das heißt also, um bei meinem Beispiel zu bleiben, dass bei folgender Definition der Klasse B und einer Exception in foo() zuerst der Destruktor des Members a_, dann der Destruktor der lokalen Variable b im try-Block, dann jener der lokalen Variable a im try-Block und erst dann der catch-Block ausgeführt wird?</p>
<pre><code class="language-cpp">class B
{
public:
    B(A a) : a_(a)
    {}

    void foo();

private:
    A a_;
};
</code></pre>
<p>Oder würde A::~A hier sogar dreimal ausgeführt, da der Kopierkonstruktor <strong>zwei</strong> neue Objekte erzeugt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1961585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1961585</guid><dc:creator><![CDATA[ph4nt0m]]></dc:creator><pubDate>Tue, 05 Oct 2010 11:06:10 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf von Destruktoren bei Exception on Tue, 05 Oct 2010 11:18:44 GMT]]></title><description><![CDATA[<p>Mach doch eine Ausgabe in den Destruktoren und probier es aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1961587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1961587</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 05 Oct 2010 11:18:44 GMT</pubDate></item></channel></rss>