<?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[Exception und Dynamischer Speicher?]]></title><description><![CDATA[<p>Hallo,</p>
<p>Folgendes ich fordere Speicher im Konstruktor meiner Klasse mittels new an! Da new eine Exception werfen kann, fange ich sie ab und gib den speicher frei der richtig angefoderte wurde.</p>
<p>Hier der mein Beispielcode:</p>
<pre><code class="language-cpp">#include&lt;new&gt;

testclass::testclass()
{
  try
  {
    testarray_[0] = new Class1(*this);
  }
  catch(std::bad_alloc &amp;e)
  {
    cout&lt;&lt;&quot;No Memory&quot;&lt;&lt;endl;
  }
  try
  {
   testarray_[1] = new Class2(*this);
  }
  catch(std::bad_alloc &amp;e)
  {
    delete testarray_[0]
    cout&lt;&lt;&quot;No Memory&quot;&lt;&lt;endl;
  }
}
</code></pre>
<p>Da dieses Array etwas länger ist wird der Code dementsprächend länger! Jetzt zu meiner eigentlichen Frage kann man es irgendwie verkürzen?<br />
Und was passiert, wenn ich delete [] ausführe auf einen Speicher, der nicht angefodert werden konnte?</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/249885/exception-und-dynamischer-speicher</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 07:46:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/249885.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 13 Sep 2009 16:16:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Exception und Dynamischer Speicher? on Sun, 13 Sep 2009 16:16:04 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Folgendes ich fordere Speicher im Konstruktor meiner Klasse mittels new an! Da new eine Exception werfen kann, fange ich sie ab und gib den speicher frei der richtig angefoderte wurde.</p>
<p>Hier der mein Beispielcode:</p>
<pre><code class="language-cpp">#include&lt;new&gt;

testclass::testclass()
{
  try
  {
    testarray_[0] = new Class1(*this);
  }
  catch(std::bad_alloc &amp;e)
  {
    cout&lt;&lt;&quot;No Memory&quot;&lt;&lt;endl;
  }
  try
  {
   testarray_[1] = new Class2(*this);
  }
  catch(std::bad_alloc &amp;e)
  {
    delete testarray_[0]
    cout&lt;&lt;&quot;No Memory&quot;&lt;&lt;endl;
  }
}
</code></pre>
<p>Da dieses Array etwas länger ist wird der Code dementsprächend länger! Jetzt zu meiner eigentlichen Frage kann man es irgendwie verkürzen?<br />
Und was passiert, wenn ich delete [] ausführe auf einen Speicher, der nicht angefodert werden konnte?</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777679</guid><dc:creator><![CDATA[_exception]]></dc:creator><pubDate>Sun, 13 Sep 2009 16:16:04 GMT</pubDate></item><item><title><![CDATA[Reply to Exception und Dynamischer Speicher? on Sun, 13 Sep 2009 16:23:09 GMT]]></title><description><![CDATA[<blockquote>
<p>Und was passiert, wenn ich delete [] ausführe auf einen Speicher, der nicht angefodert werden konnte?</p>
</blockquote>
<p>Nichts.</p>
<p>Von daher kannst du so abkürzen:</p>
<pre><code class="language-cpp">#include&lt;new&gt;

testclass::testclass()
{
  for(int i=0; i&lt;arraySize; ++i) testarrray_[i] = 0;
  try
  {
    testarray_[0] = new Class1(*this);
    testarray_[1] = new Class2(*this);
  }
  catch(std::bad_alloc &amp;e)
  {
    delete testarray_[0]
    delete testarray_[1]
    // oder noch kürzer:
    // for(int i=0; i&lt;arraySize; ++i) delete testarray_[i];
    cout&lt;&lt;&quot;No Memory&quot;&lt;&lt;endl;
  }
}
</code></pre>
<p>#edit:<br />
Ok, grade gelesen: delete auf einen NULL Pointer hat keine Auswirkung. Also vorher das ganze Array mit 0 initialisieren dann sollte es passen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777682</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Sun, 13 Sep 2009 16:23:09 GMT</pubDate></item><item><title><![CDATA[Reply to Exception und Dynamischer Speicher? on Sun, 13 Sep 2009 16:24:22 GMT]]></title><description><![CDATA[<blockquote>
<p>Und was passiert, wenn ich delete [] ausführe auf einen Speicher, der nicht angefodert werden konnte?</p>
</blockquote>
<p>Wie soll das aussehen?</p>
<p>blub² schrieb:</p>
<blockquote>
<p>Nichts.</p>
<p>Von daher kannst du so abkürzen:</p>
<pre><code class="language-cpp">...
</code></pre>
</blockquote>
<p>vorausgesetzt, testarray_ wurde zuvor initialisiert.</p>
<pre><code class="language-cpp">testclass::testclass()
: testarray_()
{
  try
  {
    testarray_[0] = new Class1(*this);
    testarray_[1] = new Class2(*this);
...
</code></pre>
<p>zweckmäßiger sind hier allemal smartpointer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777685</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 13 Sep 2009 16:24:22 GMT</pubDate></item><item><title><![CDATA[Reply to Exception und Dynamischer Speicher? on Sun, 13 Sep 2009 16:25:46 GMT]]></title><description><![CDATA[<p>Dan sollte das gesamte Array auf 0 gesetzt werden, da sonst jegliche Werte drin stehen können und dann hast du UB (wahrscheinlich Absturz)</p>
<p>Wenn du jetzt aber die Zeiger anstatt roh mit einem Smart Pointer verwaltest, dann musst du dich nicht einmal um das ganze kümmern, da es dann automatisch richtig freigegeben wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777686</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 13 Sep 2009 16:25:46 GMT</pubDate></item><item><title><![CDATA[Reply to Exception und Dynamischer Speicher? on Sun, 13 Sep 2009 16:37:43 GMT]]></title><description><![CDATA[<p>ok danke, dann werd ich es mit 0 initalisieren!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777695</guid><dc:creator><![CDATA[_exception]]></dc:creator><pubDate>Sun, 13 Sep 2009 16:37:43 GMT</pubDate></item><item><title><![CDATA[Reply to Exception und Dynamischer Speicher? on Sun, 13 Sep 2009 16:51:00 GMT]]></title><description><![CDATA[<p>Das allein ist nicht exceptionsicher, du musst natürlich noch alles freigeben.</p>
<pre><code class="language-cpp">class MyClass
{
    private:
        A* a[3];

    public:
        MyClass()
        : a()
        {
            try 
            {
                a[0] = new A(...);
                a[1] = new A(...);
                a[2] = new A(...);
            }
            catch (std::bad_alloc&amp;)
            {
                for (int i = 0; i &lt; 3; ++i)
                    delete a[i];
                throw;
            }
        }
};
</code></pre>
<p>Recht viel Code eigentlich. Mit dem Smart-Pointer <code>boost::scoped_ptr</code> geht das viel eleganter, der Konstruktor reduziert sich auf die Speicheranforderung.</p>
<pre><code class="language-cpp">class MyClass
{
    private:
        boost::scoped_ptr&lt;A&gt; a[3];

    public:
        MyClass() // keine explizite Initialisierung des Arrays nötig
        {
            a[0].reset(new A(...));
            a[1].reset(new A(...));
            a[2].reset(new A(...));
            // kein try-catch mehr nötig, keine deletes mehr nötig,
            // alles wird automatisch freigegeben!
            // Die Exception fliegt auch von selbst weiter.
        }
};
</code></pre>
<p>Übrigens brauchst du dich im Allgemeinen nicht um <code>std::bad_alloc</code> zu sorgen, da diese Exception recht selten geworfen wird - und dann meistens, weil zu viel Speicher (oder ein zu grosser Block) angefordert wurde. Viel häufiger trifft man den Fall an, bei dem ein Konstruktor eine Exception wirft und somit ein <code>new</code> fehlschlägt. In meiner oberen <code>catch</code> -Abfrage sind solche Exceptions allerdings nicht inbegriffen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1777701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1777701</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 13 Sep 2009 16:51:00 GMT</pubDate></item></channel></rss>