<?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[Ruft longjmp in C++ Destruktoren auf?]]></title><description><![CDATA[<p>Ich konnte im C++ Standard zu <code>longjmp</code> nur dies hier finden:</p>
<p>18.7  Other runtime support, Absatz 4 schrieb:</p>
<blockquote>
<p>The function signature <code>longjmp(jmp_buf jbuf, int val)</code> has more restricted behavior in this International Standard. If any automatic objects would be destroyed by a thrown exception transferring control to another (destination) point in the program, then a call to <code>longjmp(jbuf, val)</code> at the throw point that transfers control to the same (destination) point has undefined behavior.</p>
</blockquote>
<p>Bin daraus aber nicht schlau geworden.</p>
<p>Bevor jemand fragt, wieso ich <code>longjmp</code> einsetze:<br />
Habe hier eine C Bibliothek, welche damit arbeitet. In Callbacks möchte ich mit C++ Objekten arbeiten, wobei ich darin auch wieder Funktionen aus der Bibliothek aufrufe. Diese Funktionen könnten einen <code>longjmp</code> auslösen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277366/ruft-longjmp-in-c-destruktoren-auf</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 22:51:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277366.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 17 Nov 2010 15:07:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ruft longjmp in C++ Destruktoren auf? on Wed, 17 Nov 2010 15:07:30 GMT]]></title><description><![CDATA[<p>Ich konnte im C++ Standard zu <code>longjmp</code> nur dies hier finden:</p>
<p>18.7  Other runtime support, Absatz 4 schrieb:</p>
<blockquote>
<p>The function signature <code>longjmp(jmp_buf jbuf, int val)</code> has more restricted behavior in this International Standard. If any automatic objects would be destroyed by a thrown exception transferring control to another (destination) point in the program, then a call to <code>longjmp(jbuf, val)</code> at the throw point that transfers control to the same (destination) point has undefined behavior.</p>
</blockquote>
<p>Bin daraus aber nicht schlau geworden.</p>
<p>Bevor jemand fragt, wieso ich <code>longjmp</code> einsetze:<br />
Habe hier eine C Bibliothek, welche damit arbeitet. In Callbacks möchte ich mit C++ Objekten arbeiten, wobei ich darin auch wieder Funktionen aus der Bibliothek aufrufe. Diese Funktionen könnten einen <code>longjmp</code> auslösen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981758</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 17 Nov 2010 15:07:30 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft longjmp in C++ Destruktoren auf? on Wed, 17 Nov 2010 15:16:40 GMT]]></title><description><![CDATA[<p>Also die MSDN-Seite zu longjump sagt eindeutig</p>
<blockquote>
<p>When you include setjmpex.h or setjmp.h, all calls to setjmp or longjmp will result in an unwind that invokes destructors and finally calls. This differs from x86, where including setjmp.h results in finally clauses and destructors not being invoked.</p>
<p>A call to setjmp preserves the current stack pointer, non-volatile registers, and MxCsr registers. Calls to longjmp return to the most recent setjmp call site and resets the stack pointer, non-volatile registers, and MxCsr registers, back to the state as preserved by the most recent setjmp call.</p>
</blockquote>
<p>Auf <a href="http://cplusplus.com" rel="nofollow">cplusplus.com</a> steht auch noch</p>
<blockquote>
<p>The function never returns to the point where it has been invoked. Instead, the function transfers the control to the point where setjmp was used to fill the env parameter.</p>
</blockquote>
<p>So würde es für mich Sinn machen, dass ein Dtor aufgerufen wird. Wenn das Scope so radikal verlassen wird (bzw. werden kann), ist das ja sogar vernünftig imo...</p>
<p>Gruß<br />
PuerNoctis</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981764</guid><dc:creator><![CDATA[PuerNoctis]]></dc:creator><pubDate>Wed, 17 Nov 2010 15:16:40 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft longjmp in C++ Destruktoren auf? on Wed, 17 Nov 2010 15:36:46 GMT]]></title><description><![CDATA[<p>PuerNoctis schrieb:</p>
<blockquote>
<p>Also die MSDN-Seite zu longjump sagt eindeutig</p>
<blockquote>
<p>When you include setjmpex.h or setjmp.h, all calls to setjmp or longjmp will result in an unwind that invokes destructors and finally calls. This differs from x86, where including setjmp.h results in finally clauses and destructors not being invoked.</p>
<p>A call to setjmp preserves the current stack pointer, non-volatile registers, and MxCsr registers. Calls to longjmp return to the most recent setjmp call site and resets the stack pointer, non-volatile registers, and MxCsr registers, back to the state as preserved by the most recent setjmp call.</p>
</blockquote>
</blockquote>
<p>Du solltest dir schon anschauen, was du zitierst und auch gleich die Quelle mitangeben.<br />
Hier die Quelle: <a href="http://msdn.microsoft.com/en-us/library/36d3b75w.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/36d3b75w.aspx</a><br />
Das ist für x64 Programmierung.</p>
<p>PuerNoctis schrieb:</p>
<blockquote>
<p>Auf <a href="http://cplusplus.com" rel="nofollow">cplusplus.com</a> steht auch noch</p>
<blockquote>
<p>The function never returns to the point where it has been invoked. Instead, the function transfers the control to the point where setjmp was used to fill the env parameter.</p>
</blockquote>
</blockquote>
<p>Was auf <a href="http://cplusplus.com" rel="nofollow">cplusplus.com</a> steht, weiss ich auch. Aber das hilft einem überhaupt nichts dabei herauszufinden, ob eine Garantie besteht, dass die Destruktoren aufgerufen werden. Was setjmp und longjmp tun, weiss ich schon. Allerdings kenne ich es nur aus C und weiss nicht, wie die Destruktoren sich damit vertragen.</p>
<p>PuerNoctis schrieb:</p>
<blockquote>
<p>So würde es für mich Sinn machen, dass ein Dtor aufgerufen wird. Wenn das Scope so radikal verlassen wird (bzw. werden kann), ist das ja sogar vernünftig imo...</p>
</blockquote>
<p>Sinn machen heisst aber nicht, dass es garantiert ist. Gibt noch vieles was Sinn machen würde und im Standard trotzdem nur als &quot;implementation definied&quot; drin steht.</p>
<p>Wenn wir übrigens bei der MSDN bleiben, dann bekommen wir das hier:<br />
<a href="http://msdn.microsoft.com/en-us/library/yz2ez4as.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/yz2ez4as.aspx</a></p>
<p>Es wird dringend davon abgeraten. Anscheinend geht es mit der /EH Option beim MSVC. Unten steht aber, dass man sich darauf nicht verlassen sollte, wenn man portierbaren Code schreiben möchte (was auch immer Microsoft damit genau meint). So eindeutig ist es somit nicht.</p>
<p>Ich möchte nun halt gerne wissen, wie es wirklich definiert ist. Mutmassungen bringen mir nichts.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981791</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 17 Nov 2010 15:36:46 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft longjmp in C++ Destruktoren auf? on Wed, 17 Nov 2010 15:37:03 GMT]]></title><description><![CDATA[<p>es ist nicht möglich longjmp effizient zu implementieren wenn man alle destruktoren aufrufen will. deshalb nehme ich schwer an, dass dies UB ist.</p>
<p>beim vc++ ist dies zB nicht erlaubt (also über die objektscopes zu springen):</p>
<p><a href="http://msdn.microsoft.com/en-us/library/3ye15wsy(v=VS.80).aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/3ye15wsy(v=VS.80).aspx</a> schrieb:</p>
<blockquote>
<p>Be careful when using setjmp and longjmp in C++ programs. Because these functions do not support C++ object semantics, it is safer to use the C++ exception-handling mechanism.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1981792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981792</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 17 Nov 2010 15:37:03 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft longjmp in C++ Destruktoren auf? on Wed, 17 Nov 2010 16:20:43 GMT]]></title><description><![CDATA[<p>&quot;has undefined behaviour&quot; ist doch hinreichend eindeutig, oder nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981811</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 17 Nov 2010 16:20:43 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft longjmp in C++ Destruktoren auf? on Wed, 17 Nov 2010 16:48:11 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>&quot;has undefined behaviour&quot; ist doch hinreichend eindeutig, oder nicht?</p>
</blockquote>
<p>Ich bin mir allerdings nicht sicher, ob ich den Teil davor richtig verstanden haben. Deshalb schrieb ich auch, dass ich daraus nicht ganz schlau geworden bin. Wenn meine Hirnzellen das richtig verarbeiten, dann steht dort, dass wenn automatische Objekte zerstört werden, weil eine Exception von A nach B geflogen ist, dann ist es undefiniert, ob diese auch zerstört werden, wenn ein <code>longjmp</code> von A nach B durchgeführt wird.</p>
<p>(Vielleicht hoffen meine Hirnzellen auch nur einfach, dass sie dies falsch verarbeiten :D)</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981826</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 17 Nov 2010 16:48:11 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft longjmp in C++ Destruktoren auf? on Wed, 17 Nov 2010 17:07:55 GMT]]></title><description><![CDATA[<p>Nicht ganz. Es nicht nicht undefiniert, ob die Objekte zerstört werden. Das ganze Verhalten ist undefiniert.<br />
Spekulation: Wahrscheinlich hätte man sagen können, dass es unspezifiziert ist, ob die Objekte zerstört werden. Oder sogar, dass sie nicht zerstört werden. Da in solchen Fällen allerdings das ganze Lebenszyklus-Modell eines Objektes zusammenbricht dürfte man sich auf die sichere Ebene &quot;undefiniert&quot; (sprich: longjmp nur in reinem C bitte, wenn es gar nicht anders geht) geeinigt haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981838</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 17 Nov 2010 17:07:55 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft longjmp in C++ Destruktoren auf? on Wed, 17 Nov 2010 18:05:32 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Bashar schrieb:</p>
<blockquote>
<p>&quot;has undefined behaviour&quot; ist doch hinreichend eindeutig, oder nicht?</p>
</blockquote>
<p>Ich bin mir allerdings nicht sicher, ob ich den Teil davor richtig verstanden haben. Deshalb schrieb ich auch, dass ich daraus nicht ganz schlau geworden bin. Wenn meine Hirnzellen das richtig verarbeiten, dann steht dort, dass wenn automatische Objekte zerstört werden, weil eine Exception von A nach B geflogen ist, dann ist es undefiniert, ob diese auch zerstört werden, wenn ein <code>longjmp</code> von A nach B durchgeführt wird.</p>
<p>(Vielleicht hoffen meine Hirnzellen auch nur einfach, dass sie dies falsch verarbeiten :D)</p>
<p>Grüssli</p>
</blockquote>
<p>fast. Dort steht, dass wenn automatische Objekte zerstört werden <em>würden</em> (d.h. nicht-PODs, denn PODs werden nicht zerstört sondern nur freigegeben), <em>falls</em> eine Exception per throw von A nach B fliegen <em>würde</em>, dann löst die Verwendung von longjmp zum gleichen Zielpunkt B <em>an Stelle</em> des throws undefiniertes Verhalten aus.<br />
Es steht nicht da, dass Destruktoren nicht ausgeführt werden: das würde nämlich das Verhalten spezifizieren und gerade nicht undefiniert lassen.</p>
<p>Das ganze ist deshalb so umständlich formuliert, weil longjmp natürlich immer noch dort funktionieren soll, wo im Grunde nur reines C verwendet wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981877</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 17 Nov 2010 18:05:32 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft longjmp in C++ Destruktoren auf? on Wed, 17 Nov 2010 18:48:43 GMT]]></title><description><![CDATA[<p>Danke, bestätigt somit meine Befürchtungen endgültig.</p>
<p>Mal sehen, wie ich das nun am besten löse...</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981907</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 17 Nov 2010 18:48:43 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft longjmp in C++ Destruktoren auf? on Wed, 17 Nov 2010 18:58:59 GMT]]></title><description><![CDATA[<p>Wahrscheinlich musst du an den kritischen Stellen (die Zeit, in der das böse <code>longjmp()</code> aufgerufen werden könnte) auf reines C zurückgreifen, zumindest was die Objektsemantik betrifft. Andere C++-Features wie Templates kannst du ja nach wie vor verwenden. Vielleicht besteht eine Möglichkeit darin, C++-Objekte mit einem C-Interface zu wrappen, wie es in Bindings getan wird. Dann musst du die Wrapper-Objekte zwar manuell konstruieren und zerstören, aber kannst intern normal arbeiten.</p>
<p>Das Problem ist aber nicht nur ein C++-spezifisches. Wie löst man es in C, wenn eine aufgerufene Funktion den Programmkontext neu setzen kann? Falls die Kontrolle nicht direkt zum Aufrufer zurückgelangt, wird es mit Speicherfreigabe etc. unter Umständen schwierig. Überhaupt stelle ich mir das Arbeiten mit <code>setjmp()</code> und <code>longjmp()</code> ziemlich übel vor...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981911</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 17 Nov 2010 18:58:59 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft longjmp in C++ Destruktoren auf? on Wed, 17 Nov 2010 19:15:36 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Wahrscheinlich musst du an den kritischen Stellen (die Zeit, in der das böse <code>longjmp()</code> aufgerufen werden könnte) auf reines C zurückgreifen, zumindest was die Objektsemantik betrifft. Andere C++-Features wie Templates kannst du ja nach wie vor verwenden. Vielleicht besteht eine Möglichkeit darin, C++-Objekte mit einem C-Interface zu wrappen, wie es in Bindings getan wird. Dann musst du die Wrapper-Objekte zwar manuell konstruieren und zerstören, aber kannst intern normal arbeiten.</p>
</blockquote>
<p>Aktuell sieht es so aus, dass ich womöglich folgendes machen kann:</p>
<pre><code>begin callback

 some longjmp danger code

 normal c++ code without longjmp

 some longjmp danger code

end callback
</code></pre>
<p>So könnte ich eine Funktion aufrufen, welche dann den C++ Code enthält oder halt einfach einen zusätzlichen Block einführen.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Das Problem ist aber nicht nur ein C++-spezifisches. Wie löst man es in C, wenn eine aufgerufene Funktion den Programmkontext neu setzen kann? Falls die Kontrolle nicht direkt zum Aufrufer zurückgelangt, wird es mit Speicherfreigabe etc. unter Umständen schwierig. Überhaupt stelle ich mir das Arbeiten mit <code>setjmp()</code> und <code>longjmp()</code> ziemlich übel vor...</p>
</blockquote>
<p>Naja, grundsätzlich gleich wie mit Exceptions. Gewisse Kompiler verwenden <code>setjmp</code> und <code>longjmp</code> um Exceptions umzusetzen. In C muss man halt viel Code selber hinschreiben, welcher der Kompiler in C++ hinschreiben würde. In C besteht somit die Gefahr, dass man was vergisst. Man kann da auch mit Makros rumtricksen, aber auch da muss man dann auf gewisse Dinge achten. Möglich ist es definitiv und kann unter Umständen auch die Fehlerbehandlung etwas erleichtern. Also ellenlange if-else Prüfungen vernichten.</p>
<p>Aber es ist definitiv Vorsicht geboten <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>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981919</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 17 Nov 2010 19:15:36 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft longjmp in C++ Destruktoren auf? on Wed, 17 Nov 2010 19:27:22 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>So könnte ich eine Funktion aufrufen, welche dann den C++ Code enthält oder halt einfach einen zusätzlichen Block einführen.</p>
</blockquote>
<p>Ja, das ist natürlich das Einfachste, wenn die bösen Funktionen nicht auf Daten deiner C++-Objekte zugreifen und dabei unerwartete Sprünge aus deren Scope durchführen.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Aber es ist definitiv Vorsicht geboten <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>
</blockquote>
<p>C++-Exceptions passen vor allem sehr gut zu RAII. Ohne automatische Zerstörung würde man den grossen Vorteil der Exceptions einbüssen, nicht auf jeder Ebene der Aufrufhierarchie Fehlerbehandlung und Aufräumaktionen durchführen zu müssen.</p>
<p>Aber RAII kann ja <code>longjmp()</code> nicht. Wie kann man also Speicher freigeben, wenn eine Funktion den Scope zu verlassen droht? Einen Callback einrichten und jeweils neu mitgeben? An so eine Situation denke ich:</p>
<pre><code class="language-cpp">// C++
Obj obj;
FunktionMitThrow(); // kein Problem

// C
Obj* obj = CreateObj();
FunktionMitLangemSprung();
DestroyObj(obj); // evtl. zu spät
</code></pre>
<p>Sorry, falls das etwas OffTopic ist. Vielleicht sollte ich die Frage auch im C-Forum stellen... <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/1981927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981927</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 17 Nov 2010 19:27:22 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft longjmp in C++ Destruktoren auf? on Wed, 17 Nov 2010 19:53:21 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>C++-Exceptions passen vor allem sehr gut zu RAII. Ohne automatische Zerstörung würde man den grossen Vorteil der Exceptions einbüssen, nicht auf jeder Ebene der Aufrufhierarchie Fehlerbehandlung und Aufräumaktionen durchführen zu müssen.</p>
<p>Aber RAII kann ja <code>longjmp()</code> nicht. Wie kann man also Speicher freigeben, wenn eine Funktion den Scope zu verlassen droht? Einen Callback einrichten und jeweils neu mitgeben? An so eine Situation denke ich:</p>
<pre><code class="language-cpp">// C++
Obj obj;
FunktionMitThrow(); // kein Problem

// C
Obj* obj = CreateObj();
FunktionMitLangemSprung();
DestroyObj(obj); // evtl. zu spät
</code></pre>
<p>Sorry, falls das etwas OffTopic ist. Vielleicht sollte ich die Frage auch im C-Forum stellen... <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>
</blockquote>
<p>Du kannst dies grundsätzlich einfach über ein künstliches finally erreichen. Du musst dazu natürlich <code>jmp_buf</code> kapseln und immer wenn du ein neuer <code>jmp_buf</code> einführst, musst du den vorherigen speichern. Also grundsätzlich einen zusätzlichen Stack mitführen.</p>
<p>Also etwas pseudomässig:</p>
<pre><code class="language-cpp">int doRethrow = 0;
Obj* obj = CreateObj();

push_jmp_frame(); // thread_jmp_frame verweist auf ein neues Objekt.

if(setjmp(thread_jmp_frame-&gt;buf) == 0)
{
  // try
  FunktionMitLangemSprung();
}
else
{
  // catch
  doRethrow = 1;
}

pop_jmp_frame();

// finally
DestroyObj(obj);

if(doRethrow)
{
  rethrow();
}
</code></pre>
<p>Irgendetwas in der Art.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981933</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 17 Nov 2010 19:53:21 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft longjmp in C++ Destruktoren auf? on Wed, 17 Nov 2010 20:49:03 GMT]]></title><description><![CDATA[<p>Ah, klingt interessant, danke. Mit Makros könnte man das sicher noch &quot;benutzerfreundlich&quot; machen. <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>Ich sehe schon, ich muss wieder mal in Ruhe experimentieren... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981952</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 17 Nov 2010 20:49:03 GMT</pubDate></item><item><title><![CDATA[Reply to Ruft longjmp in C++ Destruktoren auf? on Wed, 17 Nov 2010 21:09:30 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ah, klingt interessant, danke. Mit Makros könnte man das sicher noch &quot;benutzerfreundlich&quot; machen. <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>
</blockquote>
<p>Jein, darüber kann man ziemlich streiten. Ich habe bis heute keine Implementation gesehen, wo du dann im TRY-CATCH-FINALLY Bereich einfach ein <code>return</code> hinsetzen konntest. Wegen den Makros wird dies dann sogar versteckt und es steht nur in der Dokumentation, dass dies nicht geht. Das ist natürlich sehr gefährlich, so hast du plötzlich einen Frame nicht entfernt. Dieser Fehler fällt womöglich auch nicht sofort auf, bis irgendwann ein longjmp bis an den Anfang zurückgehen soll. Der Fehler bleibt also vielleicht Jahre lang unentdeckt, die Software läuft Jahre lang ... und dann plötzlich passiert ein äusserst seltsamer Fehler, welche garantiertes undefiniertes Verhalten auslöst und die ganze angeschlosssene Datenbank löscht - Licht aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Also mal ganz unter uns C++'ler:<br />
Bin ich froh Exceptions und RAII zu haben! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1981967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1981967</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 17 Nov 2010 21:09:30 GMT</pubDate></item></channel></rss>