<?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[throw und konstruktor]]></title><description><![CDATA[<p>hi!</p>
<p>folgendes:</p>
<pre><code class="language-cpp">class MeineKlasse
{
  MeineKlasse() 
  {
    if(fehler)
      throw std::runtime_error(&quot;irgendwas&quot;);
  }
};

// jetzt dieses hier:
MeineKlasse* kl = NULL;
try
{
  kl = new MeineKlasse;
}
catch(std::exception&amp; e)
{
  // muss ich hier delete kl machen oder wird der speicher der von new geholt wurde
  // automatisch freigegeben, wenn eine exception im konstruktor geworfen wird?
}
</code></pre>
<p>Wenn ich das Objekt auf dem Stack erstelle ists ja klar, da wirds automatisch gelöcht, aber der speicher von new? Das objekt wurde ja nciht richtig initialisiert, vielleicht wird es ja dann auch autmatisch wieder gelköscht? ODer muss ich es selber löschen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/180538/throw-und-konstruktor</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 21:41:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/180538.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 03 May 2007 20:05:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to throw und konstruktor on Thu, 03 May 2007 20:05:45 GMT]]></title><description><![CDATA[<p>hi!</p>
<p>folgendes:</p>
<pre><code class="language-cpp">class MeineKlasse
{
  MeineKlasse() 
  {
    if(fehler)
      throw std::runtime_error(&quot;irgendwas&quot;);
  }
};

// jetzt dieses hier:
MeineKlasse* kl = NULL;
try
{
  kl = new MeineKlasse;
}
catch(std::exception&amp; e)
{
  // muss ich hier delete kl machen oder wird der speicher der von new geholt wurde
  // automatisch freigegeben, wenn eine exception im konstruktor geworfen wird?
}
</code></pre>
<p>Wenn ich das Objekt auf dem Stack erstelle ists ja klar, da wirds automatisch gelöcht, aber der speicher von new? Das objekt wurde ja nciht richtig initialisiert, vielleicht wird es ja dann auch autmatisch wieder gelköscht? ODer muss ich es selber löschen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1278387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1278387</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Thu, 03 May 2007 20:05:45 GMT</pubDate></item><item><title><![CDATA[Reply to throw und konstruktor on Thu, 03 May 2007 20:12:58 GMT]]></title><description><![CDATA[<p>Der operator delete wird automatisch aufgerufen, falls die Konstruktion des Objektes fehlschlägt. Das ist ist immer eine alles-oder-nichts-Aktion. Du hättest ja auch gar keine Möglichkeit, dort irgendwie selbst aufzuräumen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1278391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1278391</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 03 May 2007 20:12:58 GMT</pubDate></item><item><title><![CDATA[Reply to throw und konstruktor on Thu, 03 May 2007 20:16:14 GMT]]></title><description><![CDATA[<p>gut, hab ich mir auch schon gedacht, wollt mich nur noch mal versichern. IS ja aber eigentlich auch logisch.</p>
<p>Naja, ich könnt ja schon im catch-block ein delete kl; machen, aber das ja zum Glück nich nötig <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>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1278395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1278395</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Thu, 03 May 2007 20:16:14 GMT</pubDate></item><item><title><![CDATA[Reply to throw und konstruktor on Thu, 03 May 2007 20:19:55 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>Naja, ich könnt ja schon im catch-block ein delete kl; machen</p>
</blockquote>
<p>Das könntest du. Da steht aber immer noch NULL drin. Bis zur Zuweisung kommst du ja gar nicht mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1278396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1278396</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 03 May 2007 20:19:55 GMT</pubDate></item><item><title><![CDATA[Reply to throw und konstruktor on Fri, 04 May 2007 06:43:05 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Der operator delete wird automatisch aufgerufen, falls die Konstruktion des Objektes fehlschlägt. Das ist ist immer eine alles-oder-nichts-Aktion. Du hättest ja auch gar keine Möglichkeit, dort irgendwie selbst aufzuräumen.</p>
</blockquote>
<p>Das stimmt afaik nicht ganz...<br />
Es wird zwar nicht delete aufgerufen, was ja einen Destruktor-Aufruf implizieren<br />
würde, aber der Speicher wird freigegeben. Vorsicht, wenn du im Konstruktor<br />
noch etwas mit new anforderst und dann ne Exception schmeißt, dann wird<br />
dieser angeforderte Speicher nicht freigegeben, auch wenn dieser im<br />
Destruktor freigegeben würde.</p>
<p>camper schrieb:</p>
<blockquote>
<p>Das könntest du. Da steht aber immer noch NULL drin. Bis zur Zuweisung kommst du ja gar nicht mehr.</p>
</blockquote>
<p>Ich glaub nicht (bin mir ziemlich sicher), dass da nicht zwangsläufig NULL<br />
drinsteht, aber auf jeden Fall kein Zeiger auf ein gültiges Objekt</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1278512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1278512</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 04 May 2007 06:43:05 GMT</pubDate></item><item><title><![CDATA[Reply to throw und konstruktor on Fri, 04 May 2007 06:56:53 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Der operator delete wird automatisch aufgerufen, falls die Konstruktion des Objektes fehlschlägt. Das ist ist immer eine alles-oder-nichts-Aktion. Du hättest ja auch gar keine Möglichkeit, dort irgendwie selbst aufzuräumen.</p>
</blockquote>
<p>Das stimmt afaik nicht ganz...<br />
Es wird zwar nicht delete aufgerufen, was ja einen Destruktor-Aufruf implizieren<br />
würde, aber der Speicher wird freigegeben.</p>
</blockquote>
<p>Achtung: Es gibt einen kleinen, aber feinen Unterschied zwischen 'operator delete' (reine Speicherfreigabe, kann vom Programmierer bei Bedarf überschrieben werden) und 'delete' (fest vorgegeben - ruft erst den Objekt-Dtor und danach operator delete auf).</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Das könntest du. Da steht aber immer noch NULL drin. Bis zur Zuweisung kommst du ja gar nicht mehr.</p>
</blockquote>
<p>Ich glaub nicht (bin mir ziemlich sicher), dass da nicht zwangsläufig NULL<br />
drinsteht, aber auf jeden Fall kein Zeiger auf ein gültiges Objekt</p>
</blockquote>
<p>Die Zuweisung zu kl kann erst erfolgen, wenn new sauber zurückgekehrt ist. Das heißt, bei einer Exception wird überhaupt nichts zugewiesen.<br />
(OK, 100% verlassen würde ich mich darauf nicht)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1278518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1278518</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 04 May 2007 06:56:53 GMT</pubDate></item><item><title><![CDATA[Reply to throw und konstruktor on Fri, 04 May 2007 08:11:56 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>(OK, 100% verlassen würde ich mich darauf nicht)</p>
</blockquote>
<p>Wie ist das gemeint? Sollte man sich nicht auf die Richtigkeit deiner Aussage verlassen oder darauf, dass keine Zuweisung stattfindet?<br />
Scott Meyers ist jedenfalls auch der Meinung, dass keine Zuweisung stattfindet und ich verlasse mich auch darauf <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>Gruss,<br />
DeSoVoDaMu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1278565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1278565</guid><dc:creator><![CDATA[DeSoVoDaMu]]></dc:creator><pubDate>Fri, 04 May 2007 08:11:56 GMT</pubDate></item><item><title><![CDATA[Reply to throw und konstruktor on Fri, 04 May 2007 08:15:06 GMT]]></title><description><![CDATA[<p>DeSoVoDaMu schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>(OK, 100% verlassen würde ich mich darauf nicht)</p>
</blockquote>
<p>Wie ist das gemeint? Sollte man sich nicht auf die Richtigkeit deiner Aussage verlassen oder darauf, dass keine Zuweisung stattfindet?</p>
</blockquote>
<p>Auf meine eigenen Aussagen kann ich mich idR schon verlassen. Aber im obigen Fall war ich mir 'nur' 99% sicher, daß die Zuweisung nicht stattfindet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1278567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1278567</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 04 May 2007 08:15:06 GMT</pubDate></item><item><title><![CDATA[Reply to throw und konstruktor on Fri, 04 May 2007 08:25:33 GMT]]></title><description><![CDATA[<p>Hehe, sollte jetzt auch keine Verallgemeinerung im Bezug auf deine Aussagen sein, sondern speziell auf diese eine <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1278576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1278576</guid><dc:creator><![CDATA[DeSoVoDaMu]]></dc:creator><pubDate>Fri, 04 May 2007 08:25:33 GMT</pubDate></item><item><title><![CDATA[Reply to throw und konstruktor on Fri, 04 May 2007 08:36:22 GMT]]></title><description><![CDATA[<p>Wenn die Zuweisung nicht stattfindet und ich rufe delete auf, was passiert dann?</p>
<p>Gut Maxi hat vor dem new den Zeiger bereits mit NULL initialisiert, aber ansonsten würde es beim delete knallen, oder?</p>
<p>Fest steht, dass die nicht nothrow Variante von new eine std::bad_alloc Exception auslöst. Es ist aber nicht im Standard definiert, dass sie NULL zurückgibt!</p>
<p>Also wäre es fatal, wenn ich ein new Aufrufe ohne den Zeiger vorher initialisiert zu haben, oder?</p>
<p>Gruß Paddy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1278583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1278583</guid><dc:creator><![CDATA[Paddy82]]></dc:creator><pubDate>Fri, 04 May 2007 08:36:22 GMT</pubDate></item><item><title><![CDATA[Reply to throw und konstruktor on Fri, 04 May 2007 08:51:12 GMT]]></title><description><![CDATA[<p>Paddy82 schrieb:</p>
<blockquote>
<p>Wenn die Zuweisung nicht stattfindet und ich rufe delete auf, was passiert dann?</p>
<p>Gut Maxi hat vor dem new den Zeiger bereits mit NULL initialisiert, aber ansonsten würde es beim delete knallen, oder?</p>
</blockquote>
<p>Vermutlich (je nachdem, was dein Compiler mit nicht-initialisierten Variablen macht - das ergibt dann so nette Fehler, die du erst beim Release-Build bemerkst ;))</p>
<blockquote>
<p>Fest steht, dass die nicht nothrow Variante von new eine std::bad_alloc Exception auslöst. Es ist aber nicht im Standard definiert, dass sie NULL zurückgibt!</p>
</blockquote>
<p>Wenn eine Funktion per throw verlassen wird, <strong>kann</strong> sie gar nichts zurückgeben. Also ist es sinnlos, darüber nachzudenken, was mit ihren Rückgabewerten passieren könnte. (und afaik besagt die Angabe 'nothrow' nur, daß new keine Exceptions aus sich heraus zurückgeben kann - Exceptions aus dem Ctor werden auch bei der nothrow-Version von new weitergereicht)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1278598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1278598</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 04 May 2007 08:51:12 GMT</pubDate></item><item><title><![CDATA[Reply to throw und konstruktor on Fri, 04 May 2007 08:53:39 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Exceptions aus dem Ctor werden auch bei der nothrow-Version von new weitergereicht</p>
</blockquote>
<p>Da hast Du recht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1278602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1278602</guid><dc:creator><![CDATA[Paddy82]]></dc:creator><pubDate>Fri, 04 May 2007 08:53:39 GMT</pubDate></item><item><title><![CDATA[Reply to throw und konstruktor on Fri, 04 May 2007 19:57:26 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>CSpille schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Der operator delete wird automatisch aufgerufen, falls die Konstruktion des Objektes fehlschlägt. Das ist ist immer eine alles-oder-nichts-Aktion. Du hättest ja auch gar keine Möglichkeit, dort irgendwie selbst aufzuräumen.</p>
</blockquote>
<p>Das stimmt afaik nicht ganz...<br />
Es wird zwar nicht delete aufgerufen, was ja einen Destruktor-Aufruf implizieren<br />
würde, aber der Speicher wird freigegeben.</p>
</blockquote>
<p>Achtung: Es gibt einen kleinen, aber feinen Unterschied zwischen 'operator delete' (reine Speicherfreigabe, kann vom Programmierer bei Bedarf überschrieben werden) und 'delete' (fest vorgegeben - ruft erst den Objekt-Dtor und danach operator delete auf).</p>
</blockquote>
<p>Zur Ergänzung - Dieses Problem taucht meist nur bei der Diskussion um delete auf, aber das gilt generell:<br />
Wir unterscheiden einerseits zwischen 'operator x' - das ist der eingebaute Operator, der sich so ähnlich wie eine Funktion verhält, oder eine Überladung (wir nennen das ganze einfach so, wie wir code schreiben, so wie void f() eben die Funktion f bezeichnet, so schreiben wir auch x operator+(...) oder void operator delete(...) und das ist dann eben Operator+ bzw. Operator delete. Andererseits gibt es auch noch den + Operator oder den delete Operator. Damit ist das syntaktische Element Operator gemeint: der Bestandteil eines Ausdrucks, der die Art des Ausdrucks bestimmt - also eben das Plus oder das Schlüsselwort delete in einem Ausruck. Für eine präzise Formulierung ist es ist sehr wichtig, auf die Reihenfolge zu achten. Wir kennen das ja zum Beispiel auch von Klassentemplates und Templateklassen.</p>
<blockquote>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Das könntest du. Da steht aber immer noch NULL drin. Bis zur Zuweisung kommst du ja gar nicht mehr.</p>
</blockquote>
<p>Ich glaub nicht (bin mir ziemlich sicher), dass da nicht zwangsläufig NULL<br />
drinsteht, aber auf jeden Fall kein Zeiger auf ein gültiges Objekt</p>
</blockquote>
<p>Die Zuweisung zu kl kann erst erfolgen, wenn new sauber zurückgekehrt ist. Das heißt, bei einer Exception wird überhaupt nichts zugewiesen.<br />
(OK, 100% verlassen würde ich mich darauf nicht)</p>
</blockquote>
<p>Mein Statement bezog sich auf den Code, so wie er konkret gegeben war. Keine Zuweisung heißt in diesem Falle, es passiert überhaupt nichts mit dem Zeiger. Das ist dann auch keine Frage von Operator- vs. Funktionssemantik. Um zuweisen zu können, muss erst einmal ein Wert bestimmt werden und das schlägt ja fehl. Wenn ich sage, dort steht NULL drin, dann nur, weil das auch vorher schon so war.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1278980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1278980</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 04 May 2007 19:57:26 GMT</pubDate></item></channel></rss>