<?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 starker Exceptionsicherheit]]></title><description><![CDATA[<p>Hoi! <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 hab mal ne Frage.<br />
Bei meinem Code hab ich natürlich immer auf eine grundlegende Exceptionssicherheit geachtet, dh. es werden keine Resourcen geleaked, aber mit starker hab ich mich nie beschäftigt.</p>
<p>Jetzt frage ich mich: Wenn der Constructor eine Exception wirft, darf ich zu 100% davon ausgehen, dass es absolut verboten ist das Objekt zu nutzen, oder?</p>
<p>Ich bin mir sicher dass es so ist, möchte es aber genau wissen.<br />
Grüße,<br />
Ethon</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/292179/frage-zu-starker-exceptionsicherheit</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 04:24:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/292179.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 04 Sep 2011 17:50:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Sun, 04 Sep 2011 17:50:50 GMT]]></title><description><![CDATA[<p>Hoi! <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 hab mal ne Frage.<br />
Bei meinem Code hab ich natürlich immer auf eine grundlegende Exceptionssicherheit geachtet, dh. es werden keine Resourcen geleaked, aber mit starker hab ich mich nie beschäftigt.</p>
<p>Jetzt frage ich mich: Wenn der Constructor eine Exception wirft, darf ich zu 100% davon ausgehen, dass es absolut verboten ist das Objekt zu nutzen, oder?</p>
<p>Ich bin mir sicher dass es so ist, möchte es aber genau wissen.<br />
Grüße,<br />
Ethon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2114810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2114810</guid><dc:creator><![CDATA[Ethon_notloggedin]]></dc:creator><pubDate>Sun, 04 Sep 2011 17:50:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Sun, 04 Sep 2011 18:09:15 GMT]]></title><description><![CDATA[<p>Wenn der Konstruktor eine Exception wirft, hat es nie existiert, du kannst es also nicht nutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2114818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2114818</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sun, 04 Sep 2011 18:09:15 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Sun, 04 Sep 2011 19:08:49 GMT]]></title><description><![CDATA[<p>Genau.</p>
<p>@Ethon_notloggedin:<br />
Wie würdest du das überhaupt anstellen wollen? Also den Versuche das Objekt trotz fehlgeschlagenem Konstruktor zu nutzen.</p>
<p>(Ich wüsste schon eine Möglichkeit, würde mich aber wundern wenn du an die gedacht hättest)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2114853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2114853</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 04 Sep 2011 19:08:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Mon, 05 Sep 2011 07:21:05 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>(Ich wüsste schon eine Möglichkeit, würde mich aber wundern wenn du an die gedacht hättest)</p>
</blockquote>
<p>Magst du uns die mal zeigen? Würde mich interessieren - mit der gleichen Faszination, die andere bei Horrorfilmen haben <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><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26744">@Ethon</a>:</p>
<pre><code class="language-cpp">class MyClass
{
public:
  MyClass() {throw &quot;meh.&quot;;}
};

void foo()
{
  try
  {
    MyClass mc;
    /* we never get here, so we can't use mc. */ 
  }
  catch(...)
  {
    /* mc does not exist here */
  }

  MyClass* pmc = nullptr;
  try
  {
    pmc = new MyClass();
    /* we never get here, so we can't use (*pmc). */ 
  }
  catch(...)
  {
    /* pmc exists, but is still nullptr. No MyClass-object to use. */
  }
}
</code></pre>
<p>Wie meinst du an ein MyClass Objekt zu kommen, wenn der Ctor wirft?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115028</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 05 Sep 2011 07:21:05 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Mon, 05 Sep 2011 07:36:43 GMT]]></title><description><![CDATA[<p>Jop, ich hatte zuerst im Kopf dass es per new gehen würde, was aber logischerweise nicht geht. Denkfehler meinerseits. <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>Gäbe höchstens die Möglichkeit mit placement-new, aber dazu müsste man wohl ziemlich hartgesotten sein, aber sowas werde ich wohl kaum unterstützen müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115033</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115033</guid><dc:creator><![CDATA[Ethon_notloggedin]]></dc:creator><pubDate>Mon, 05 Sep 2011 07:36:43 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Mon, 05 Sep 2011 07:51:49 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Magst du uns die mal zeigen?</p>
</blockquote>
<p>MyClass könnte einen globalen Pointer im Ctor vor dem Werfen setzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115037</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Mon, 05 Sep 2011 07:51:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Mon, 05 Sep 2011 08:03:36 GMT]]></title><description><![CDATA[<p>Jockelx schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Magst du uns die mal zeigen?</p>
</blockquote>
<p>MyClass könnte einen globalen Pointer im Ctor vor dem Werfen setzen.</p>
</blockquote>
<p>Das würde der starken Exceptionsicherheit aber widersprechen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115045</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 05 Sep 2011 08:03:36 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Mon, 05 Sep 2011 08:33:35 GMT]]></title><description><![CDATA[<p>Jockelx schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Magst du uns die mal zeigen?</p>
</blockquote>
<p>MyClass könnte einen globalen Pointer im Ctor vor dem Werfen setzen.</p>
</blockquote>
<p>Und? Dann hätte ich trotzdem noch kein Objekt von MyClass. Die Frage des OT war, ob es verboten ist, das Objekt zu nutzen. Die Antwort ist, dass es kein Objekt gibt, für das es so ein Verbot geben könnte. Da kann der Ctor noch so viele Nebenwirkungen haben. Die Lebenszeit eines Objektes beginnt erst dann, wenn der Ctor regulär verlassen wurde.</p>
<p>Ethon_notloggedin schrieb:</p>
<blockquote>
<p>Gäbe höchstens die Möglichkeit mit placement-new</p>
</blockquote>
<p>Placement new:</p>
<pre><code class="language-cpp">void pnew()
{
  void* storage = ::operator new(sizeof(MyClass));
  MyClass* pmc = nullptr;
  try 
  { 
    pmc = new(storage) MyClass(); //placement new
    /* we never get here... */
    pmc-&gt;~MyClass();
  }
  catch(...)
  {
    /* pmc is nullptr, because the Ctor threw before the assignment to pmc */ 
    /* storage still points to raw storage, there never was an object constructed in it */
  }
  ::operator delete(storage);
}
</code></pre>
<p>genau das ist übrigens auch der Grund, warum placement new immer mit manuell aufgerufenem Dtor gematcht werden muss. Auch hier gilt: das Objekt hat nie existiert. Auch wenn ggf. (bei nicht-starker Exceptionsicherheit) der Inhalt des rohen Speichers hinter <code>storage</code> geändert wurde oder andere Nebenwirkungen sichtbar werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115057</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 05 Sep 2011 08:33:35 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Mon, 05 Sep 2011 09:00:11 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Und? Dann hätte ich trotzdem noch kein Objekt von MyClass.</p>
</blockquote>
<p>Warum?<br />
~~<br />
Muss noch ein reinterpret_cast drauf, aber das Objekt ist doch noch da.~~qutatsch<br />
Es ging doch nur um die Möglichkeit, irgendwie auf das (kaputte) Objekt zuzugreifen oder?</p>
<p>Wahrscheinlich ist das nicht Standardkonform oder oder so; kA. das interessiert mich bei Sachen, die ich so eh nie machen würde wenig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115067</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Mon, 05 Sep 2011 09:00:11 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Mon, 05 Sep 2011 09:01:37 GMT]]></title><description><![CDATA[<p>Jockelx schrieb:</p>
<blockquote>
<p>Es ging doch nur um die Möglichkeit, irgendwie auf das (kaputte) Objekt zuzugreifen oder?</p>
</blockquote>
<pre><code class="language-cpp">int main()
{
  std::string *s;
  std::cout &lt;&lt; s-&gt;length();
}
</code></pre>
<p>..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115070</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 05 Sep 2011 09:01:37 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Mon, 05 Sep 2011 09:04:27 GMT]]></title><description><![CDATA[<p>Wenn im String-Ctor der Wert auf &quot;Hallo&quot; gesetzt wird, kommt bei dir nicht '5' als Augabe. Von daher nicht vergleichbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115071</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Mon, 05 Sep 2011 09:04:27 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Mon, 05 Sep 2011 09:25:38 GMT]]></title><description><![CDATA[<p>Jockelx schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Und? Dann hätte ich trotzdem noch kein Objekt von MyClass.</p>
</blockquote>
<p>Warum?<br />
~~<br />
Muss noch ein reinterpret_cast drauf, aber das Objekt ist doch noch da.~~qutatsch<br />
Es ging doch nur um die Möglichkeit, irgendwie auf das (kaputte) Objekt zuzugreifen oder?</p>
</blockquote>
<p>Nochmal: ES EXISTIERT KEIN OBJEKT! NICHTMAL EIN KAPUTTES! Wenn der Ctor nicht regulär verlassen wird, hast du vielleicht irgendwelche Nebenwirkungen verursacht, aber es existiert weder das Objekt, noch irgendwelche Teilobjekte. Auch wenn alle Member- und Basisklassen-Konstruktoren durchlaufen worden sind (d.h. wenn die Exception erst im Ctor-Rumpf fliegt), werden dafür auch die Destruktoren aufgerufen, sobald der Ctor mit einer Exception verlassen wird.</p>
<p>Es gibt folgende 3 Möglichkeiten:</p>
<ol>
<li>Wenn das Objekt auf dem Stack hätte erzeugt werden sollen (wurde es ja nie), wird durch die Excpetion der Gültigkeitsbereich verlassen -&gt; Der Platz auf dem Stack wird auch gleich mit weggeworfen. Keine Möglichkeit an irgendwas heranzukommen.</li>
<li>Wenn das Objekt auf dem Freispeicher hätte erzeugt werden sollen ( <code>new MyClass()</code> ) wird erst Speicher allokiert, dann der Ctor mit der Exception veröassen und der Speicher sofort wieder deallokiert. -&gt; Kein Speicher, kein Obejkt, keine Möglichkeit an irgendwas ranzukommen.</li>
<li>Wenn das Objekt mit Placement new in irgendwelchem wie auch immer gearteten Speicher hätte erzeugt werden sollen, dann war das roher Speicher. (Ein dort vorher bestehendes Objekt von &quot;class-Type&quot; mit placement new überzubügeln wäre UB). Wenn der Ctor fehlschlägt sind alle Teilobjekte, die dort vielleicht im Rahmen des Ctors vor dem Werfen initialisiert wurden, wieder zerstört. Es bleibt also roher Speicher. Wenn sich das Bitmuster dieses Speichers durch die Ausführung des Ctors geändert haben sollte ist das genauso eine Nebenwirkung wie irgendwelche veränderten globalen Variablen. Das heißt dann aber nur, dass der Ctor nicht die starke Garantie gibt. Das MyClass Objekt hat deshalb trotzdem noch nie existiert.</li>
</ol>
<p>Mit irgendwelchen C-Casts oder reinterpret_casts jetzt einen Pointer auf ein MyClass aus dem Hut zu zaubern, bringt nichts. Jeder Zugriff darauf ist UB, egal ob man vorher versucht hat, an der Stelle ein MyClass zu konstruieren oder nicht. Ctor-Exception heißt, das Objekt hat nie existiert. Da gibts keinen Weg drumrum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115081</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 05 Sep 2011 09:25:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Mon, 05 Sep 2011 09:25:02 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">/* ... */
</code></pre>
</blockquote>
<p>Du versuchst, auf etwas zuzugreifen, was nicht existiert (und nie existiert hat). Das ist UB.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115084</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 05 Sep 2011 09:25:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Mon, 05 Sep 2011 09:44:07 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>cooky451 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">/* ... */
</code></pre>
</blockquote>
<p>Du versuchst, auf etwas zuzugreifen, was nicht existiert (und nie existiert hat). Das ist UB.</p>
</blockquote>
<p>Ja, echt? Wäre ich nie drauf gekommen..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115095</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 05 Sep 2011 09:44:07 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Mon, 05 Sep 2011 10:14:31 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Ja, echt? Wäre ich nie drauf gekommen..</p>
</blockquote>
<p>Mir ist klar, dass du das weißt. Es steht nur in keinem Zusammenhang zu dem, was du zitiert hast oder zur Frage des Threaderstellers.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115111</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 05 Sep 2011 10:14:31 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Mon, 05 Sep 2011 10:23:33 GMT]]></title><description><![CDATA[<p>Irgendwie schon. Jockelx versucht irgendwie über einen Pointer auf ein Objekt zuzugreifen, das nie existiert hat. Das Beispiel macht das Gleiche, nur mit weniger drum rum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115114</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Mon, 05 Sep 2011 10:23:33 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Mon, 05 Sep 2011 10:58:06 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Jockelx versucht irgendwie über einen Pointer auf ein Objekt zuzugreifen, das nie existiert hat.</p>
</blockquote>
<p>Stimmt.</p>
<p>cooky451 schrieb:</p>
<blockquote>
<p>Das Beispiel macht das Gleiche, nur mit weniger drum rum.</p>
</blockquote>
<p>Nö. Dein Beispiel macht da ja gar nix; insb. werden auch keine Werte vom Ctor in den Speicher geschrieben.<br />
Zumindest das macht meine Version ja schon.<br />
Ist mir aber ziemlich wurscht; wenn Hustbaer da was schöneres auf Lager hat, gerne, wenn nicht, auch egal.<br />
Das brauch eh kein Mensch, bzw. ich zumindest nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115135</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Mon, 05 Sep 2011 10:58:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu starker Exceptionsicherheit on Mon, 05 Sep 2011 11:36:21 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Das Beispiel macht das Gleiche, nur mit weniger drum rum.</p>
</blockquote>
<p>Das weniger drumrum, sprich der fehlgeschlagene Ctor-Aufruf ist aber der Kern der Angelegenheit. Dass dein Beispiel UB ist, ist allen klar. Dass die Situation nach einem fehlgeschlagenen Ctor-Aufruf im Prinzip die gleiche ist, weil das Objekt eben nicht existiert, ist der Punkt, den du nicht erwähnt hast. Und genau deshalb ist dein Beispiel für die Frage &quot;Objektzugriff nach Ctor-Exception&quot; erstmal nicht in Zusammenhang gebracht.</p>
<p>Jockelx schrieb:</p>
<blockquote>
<p>insb. werden auch keine Werte vom Ctor in den Speicher geschrieben.<br />
Zumindest das macht meine Version ja schon.</p>
</blockquote>
<p>Nur wenn der Ctor die starke Garantie nicht gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2115170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2115170</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 05 Sep 2011 11:36:21 GMT</pubDate></item></channel></rss>