<?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[Pointer Array try catch]]></title><description><![CDATA[<p>Hallo Leute ich bin auf ein float * array angewiesen, welches ich an eine andere Funktion übergeben muss und wollte wissen wie es sich mit der speicher reservierung verhält. Mein Code:</p>
<pre><code class="language-cpp">xyz = new float[n];

if( xyz == NULL )
{
  ...
}
</code></pre>
<p>wie könnte man es halbwegs auf C++ Weise lösen? Gibt es für new auch exceptions wenn nicht genügend Speicher reserviert werden konnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/310226/pointer-array-try-catch</link><generator>RSS for Node</generator><lastBuildDate>Tue, 04 Aug 2026 22:38:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/310226.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 Nov 2012 16:42:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer Array try catch on Tue, 06 Nov 2012 16:42:05 GMT]]></title><description><![CDATA[<p>Hallo Leute ich bin auf ein float * array angewiesen, welches ich an eine andere Funktion übergeben muss und wollte wissen wie es sich mit der speicher reservierung verhält. Mein Code:</p>
<pre><code class="language-cpp">xyz = new float[n];

if( xyz == NULL )
{
  ...
}
</code></pre>
<p>wie könnte man es halbwegs auf C++ Weise lösen? Gibt es für new auch exceptions wenn nicht genügend Speicher reserviert werden konnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268218</guid><dc:creator><![CDATA[asdasdasdasd]]></dc:creator><pubDate>Tue, 06 Nov 2012 16:42:05 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer Array try catch on Tue, 06 Nov 2012 16:45:53 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;vector&gt;

int main()
{
   unsigned int n = 123456;

   try
   {
      std::vector&lt;float&gt;( n );
   }
   catch( std::bad_alloc&amp; excp )
   {
      ...
   }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2268225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268225</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Tue, 06 Nov 2012 16:45:53 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer Array try catch on Tue, 06 Nov 2012 16:47:49 GMT]]></title><description><![CDATA[<p>Ich verstehe die erste Frage nicht. Oder gibt es nur die eine? Was ich allerdings sehe, ist undefiniertes Verhalten, erzeugt durch Zeile 3.</p>
<blockquote>
<p>Gibt es für new auch exceptions wenn nicht genügend Speicher reserviert werden konnte?</p>
</blockquote>
<p>Ja. Du erhälst dann eine Exception vom Typ <code>bad_alloc</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268226</guid><dc:creator><![CDATA[*Rewind*]]></dc:creator><pubDate>Tue, 06 Nov 2012 16:47:49 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer Array try catch on Tue, 06 Nov 2012 16:53:08 GMT]]></title><description><![CDATA[<p>Danke für die Antworten, habs jetzt mal so hingeschrieben... wenigstens etwas:</p>
<pre><code class="language-cpp">... 
try
{
  xyz = new float[n];
}
catch( std::bad_alloc&amp; excp )
{
  // nicht genug speicher
}
catch( ... )
{
 // etwas anderes
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2268230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268230</guid><dc:creator><![CDATA[asdsaddsaas]]></dc:creator><pubDate>Tue, 06 Nov 2012 16:53:08 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer Array try catch on Tue, 06 Nov 2012 16:55:53 GMT]]></title><description><![CDATA[<p>[Rewind] schrieb:</p>
<blockquote>
<p>Was ich allerdings sehe, ist undefiniertes Verhalten, erzeugt durch Zeile 3.</p>
</blockquote>
<p>Nanu? Ich sehe bloß eine Bedingung, die niemals wahr werden kann.<br />
@Threadersteller: new gibt überhaupt gar keine 0 zurück, sondern schmeißt nur eine Exception im Fehlerfall (außer man nutzt den zurecht selten benutzten nothrow-specifier). Mach es einfach so wie DocShoe zeigt, mit vector wirst du glücklich.</p>
<p>asdsaddsaas schrieb:</p>
<blockquote>
<p>Danke für die Antworten, habs jetzt mal so hingeschrieben... wenigstens etwas:</p>
<pre><code class="language-cpp">... 
try
{
  xyz = new float[n];
}
catch( std::bad_alloc&amp; excp )
{
  // nicht genug speicher
}
catch( ... )
{
 // etwas anderes
}
</code></pre>
</blockquote>
<p>Da du nach C++-Stil fragst: Nein, das ist ganz und gar nicht C++-Stil. Das ist Java-Stil. Meines Wissens nach nicht einmal guter Java-Stil.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268233</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 06 Nov 2012 16:55:53 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer Array try catch on Tue, 06 Nov 2012 17:15:43 GMT]]></title><description><![CDATA[<p>IMO sollte man bad_alloc nicht catchen.</p>
<p>Die Frage ist, wenn du die Exception fängst: Wie willst du darauf reagieren?</p>
<p>Und hier ist die Antwort: <strong>Du bist auf das Array angewiesen</strong>, also kannst du nur terminieren (oder wie willst du das zurechtbiegen?).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268234</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 06 Nov 2012 17:15:43 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer Array try catch on Tue, 06 Nov 2012 17:05:34 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>IMO sollte man bad_alloc nicht catchen.</p>
<p>Die Frage ist, wenn du die Exception fängst: Wie willst du darauf reagieren?</p>
<p>Und hier ist die Antwort: <strong>Du bist auf das Array angewiesen</strong>, also kannst du nur terminieren (oder wie willst du das zurechtbiegen?).</p>
<p>Edit: Btw, zu diesem try-catch Block gibt es in einem anderen Thread gerade eine Diskussion, vielleicht kann die jemand verlinken.</p>
</blockquote>
<p>Ich könnte dem User sagen dass die Aktion fehlgeschlagen ist und ihn trotzdem weiterarbeiten lassen ... oder ihm zumindestens die Möglichkeit geben, seine Arbeit zu sichern. Nur so ein paar Ideen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268246</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Tue, 06 Nov 2012 17:05:34 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer Array try catch on Tue, 06 Nov 2012 17:22:26 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>IMO sollte man bad_alloc nicht catchen.</p>
<p>Die Frage ist, wenn du die Exception fängst: Wie willst du darauf reagieren?</p>
<p>Und hier ist die Antwort: <strong>Du bist auf das Array angewiesen</strong>, also kannst du nur terminieren (oder wie willst du das zurechtbiegen?).</p>
<p>Edit: Btw, zu diesem try-catch Block gibt es in einem anderen Thread gerade eine Diskussion, vielleicht kann die jemand verlinken.</p>
</blockquote>
<p>Ich könnte dem User sagen dass die Aktion fehlgeschlagen ist und ihn trotzdem weiterarbeiten lassen ... oder ihm zumindestens die Möglichkeit geben, seine Arbeit zu sichern. Nur so ein paar Ideen.</p>
</blockquote>
<p>Klar, dann macht es Sinn.</p>
<p>Eigentlich meine ich auch so Fälle wo wenig Speicher allokiert wird.<br />
Oder setzt du jedes push_back in einen try-catch Block?<br />
Und wo setzt du da die Grenze, ab wie viel Byte würdest du fangen und wo ignorierst du das?</p>
<p>Ob der TE jetzt 100 MB oder nur ein 100 000 großes float Array, wissen wir ja nicht <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="🙂"
    /> und letztere Größenordnung ist schon wahrscheinlicher.</p>
<p>@TE: Es gibt noch<a href="http://www.cplusplus.com/reference/std/new/set_new_handler/" rel="nofollow"> <code>set_new_handler()</code> </a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268253</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 06 Nov 2012 17:22:26 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer Array try catch on Tue, 06 Nov 2012 17:30:42 GMT]]></title><description><![CDATA[<p>Für das fehlgeschlagene Verhalten muss eine Statusvariable <code>status</code> definiert werden.</p>
<pre><code class="language-cpp">void blub( ... , float *xyz , int &amp;n, int &amp;status )
</code></pre>
<p>Sie wird auf einen Fehlerwert gesetzt, sobald die Funktion blub nicht glücklich geworden ist.</p>
<p>An <code>vector&lt;float&gt;</code> habe ich auch schon gedacht. Ich bin mir aber nicht sicher ob die aufrufende Funktion mein <code>&amp;xyz[0]</code> nicht irgendwie in der Größe verändert oder anderweitig gebraucht, so dass mein <code>vector</code> korrumpiert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268265</guid><dc:creator><![CDATA[asdasdasdasd]]></dc:creator><pubDate>Tue, 06 Nov 2012 17:30:42 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer Array try catch on Tue, 06 Nov 2012 17:30:50 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Eigentlich meine ich auch so Fälle wo wenig Speicher allokiert wird.<br />
Oder setzt du jedes push_back in einen try-catch Block?<br />
Und wo setzt du da die Grenze, ab wie viel Byte würdest du fangen und wo ignorierst du das?</p>
</blockquote>
<p>Man fängt und behandelt Fehler dort wo man sie sinnvoll behandeln kann.<br />
Irgendwie logisch, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268266</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268266</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 06 Nov 2012 17:30:50 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer Array try catch on Tue, 06 Nov 2012 17:49:10 GMT]]></title><description><![CDATA[<p>hustbaer: Ja, du hast Recht.</p>
<p>asdasdasdasd schrieb:</p>
<blockquote>
<p>Für das fehlgeschlagene Verhalten muss eine Statusvariable <code>status</code> definiert werden.</p>
<pre><code class="language-cpp">void blub( ... , float *xyz , int &amp;n, int &amp;status )
</code></pre>
<p>Sie wird auf einen Fehlerwert gesetzt, sobald die Funktion blub nicht glücklich geworden ist.</p>
</blockquote>
<p>Man könnte auch den Status zurückgeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268280</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 06 Nov 2012 17:49:10 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer Array try catch on Tue, 06 Nov 2012 17:57:45 GMT]]></title><description><![CDATA[<p>asdasdasdasd schrieb:</p>
<blockquote>
<p>An <code>vector&lt;float&gt;</code> habe ich auch schon gedacht. Ich bin mir aber nicht sicher ob die aufrufende Funktion mein <code>&amp;xyz[0]</code> nicht irgendwie in der Größe verändert oder anderweitig gebraucht, so dass mein <code>vector</code> korrumpiert wird.</p>
</blockquote>
<p>Und wie würde das bei einem mit new erzeugten Array sein? Es gibt kein renew in C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268290</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 06 Nov 2012 17:57:45 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer Array try catch on Wed, 07 Nov 2012 09:11:47 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>hustbaer: Ja, du hast Recht.</p>
<p>asdasdasdasd schrieb:</p>
<blockquote>
<p>Für das fehlgeschlagene Verhalten muss eine Statusvariable <code>status</code> definiert werden.</p>
<pre><code class="language-cpp">void blub( ... , float *xyz , int &amp;n, int &amp;status )
</code></pre>
<p>Sie wird auf einen Fehlerwert gesetzt, sobald die Funktion blub nicht glücklich geworden ist.</p>
</blockquote>
<p>Man könnte auch den Status zurückgeben.</p>
</blockquote>
<p>Auf die Signatur der Funktion habe ich leider keinen Einfluss.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>asdasdasdasd schrieb:</p>
<blockquote>
<p>An <code>vector&lt;float&gt;</code> habe ich auch schon gedacht. Ich bin mir aber nicht sicher ob die aufrufende Funktion mein <code>&amp;xyz[0]</code> nicht irgendwie in der Größe verändert oder anderweitig gebraucht, so dass mein <code>vector</code> korrumpiert wird.</p>
</blockquote>
<p>Und wie würde das bei einem mit new erzeugten Array sein? Es gibt kein renew in C++.</p>
</blockquote>
<p>Mein Wirkungsbereich ist leider nur innerhalb dieser Funktion, wahrscheinlich wird dann <code>realloc</code> oder Ähnliches verwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268458</guid><dc:creator><![CDATA[asdasdasdasd]]></dc:creator><pubDate>Wed, 07 Nov 2012 09:11:47 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer Array try catch on Wed, 07 Nov 2012 09:20:48 GMT]]></title><description><![CDATA[<p>realloc funktioniert bei new[] auch nicht.<br />
new[] bietet dir praktisch keinen Vorteil gegenüber std::vector, wohl aber Nachteile.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268459</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Wed, 07 Nov 2012 09:20:48 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer Array try catch on Wed, 07 Nov 2012 09:48:01 GMT]]></title><description><![CDATA[<p>asdasdasdasd schrieb:</p>
<blockquote>
<p>Mein Wirkungsbereich ist leider nur innerhalb dieser Funktion, wahrscheinlich wird dann <code>realloc</code> oder Ähnliches verwendet.</p>
</blockquote>
<p>Auch dies ist unmöglich (selbst wenn man das undefinierte Verhalten ignoriert), da die Funktion den neuen Wert des Pointers nicht nach außen geben kann, bei dieser Signatur.</p>
<pre><code>void funktioniert_nicht(int *foo)
{
  foo = (int*) realloc(foo, 24);  // Ziemlich böse Idee, aber wir machen das mal einfach
}

int main()
{
  // Welche Szenarien sind nun denkbar, in denen die Funktion &quot;funktioniert_nicht&quot; 
  // wie angedacht funktioniert? Folgende Aufrufe sind alle syntaktisch korrekt, aber etwas schlimmes
  // passiert. Das liegt nicht an den Aufrufen, sondern weil &quot;funktioniert_nicht&quot; falsch ist.

  std::vector&lt;int&gt; a;
  funktioniert_nicht(&amp;a[0]); // Bumm! Klar warum.

  int *b = new int[2];
  funktioniert_nicht(b); // Bumm! realloc und new sind nicht kompatibel. 
                         // Doppelbumm! Unser b hat sich nicht verändert, aber der Speicher ist futsch.

  int c[4];
  funktioniert_nicht(c); // Bumm! Statisches Array reallokiert

  int* d = (int*) malloc(4);
  funktioniert_nicht(d); // Bumm! Unser d hat sich nicht verändert, aber der Speicher ist futsch
}
</code></pre>
<p>Du machst dir völlig umsonst Panik.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268466</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 07 Nov 2012 09:48:01 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer Array try catch on Wed, 07 Nov 2012 11:22:10 GMT]]></title><description><![CDATA[<p>Zunächst einmal denke ich wäre es am besten ein set_new_handler() zu benutzen um speicherfehler auszuschließen -&gt; Micrsoft hat da ne gute hilfe. Wegen der Übergabe (kann leider kein Code gerade Zeigen) hänge gerade im Unterricht.</p>
<p>Objekt normal übergeben &quot;void bla(Operator <em>name)&quot;<br />
dann Inhalt zwischenspeichern und alten speicher freigeben &quot;delete [] name;&quot;<br />
neuen speicher mit new anlegen (bei z.B. char</em> länge auslesen mit<br />
&quot;variable =strlen(name)&quot; und in new name(variable) einsetzen)) dann<br />
z.B. neue Adresse zurückgeben</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268500</guid><dc:creator><![CDATA[blalala]]></dc:creator><pubDate>Wed, 07 Nov 2012 11:22:10 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer Array try catch on Wed, 07 Nov 2012 13:08:44 GMT]]></title><description><![CDATA[<p>blalala schrieb:</p>
<blockquote>
<p>Zunächst einmal denke ich wäre es am besten ein set_new_handler() zu benutzen um speicherfehler auszuschließen</p>
</blockquote>
<p>Es gibt da doch kein &quot;Bestes&quot;. Je nach dem wo es Sinn macht, behandelt man die Fehler, das hat doch schon hustbaer gesagt.</p>
<p>Btw. habe ich den Link dazu bereits angegeben, falls es der TE ihn jetzt haben will:</p>
<p>Sone schrieb:</p>
<blockquote>
<p>@TE: Es gibt noch<a href="http://www.cplusplus.com/reference/std/new/set_new_handler/" rel="nofollow"> <code>set_new_handler()</code> </a>.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2268539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268539</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 07 Nov 2012 13:08:44 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer Array try catch on Wed, 07 Nov 2012 17:03:04 GMT]]></title><description><![CDATA[<p>Supi, habe wieder jede Menge gelernt. Danke an alle Beitragenden <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/2268631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268631</guid><dc:creator><![CDATA[asdasdasdasd]]></dc:creator><pubDate>Wed, 07 Nov 2012 17:03:04 GMT</pubDate></item></channel></rss>