<?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[Stack-Objekte in while-Schleife und Exceptions]]></title><description><![CDATA[<p>Hallo,</p>
<p>der Vorteil von Stack-Objekten liegt ja darin,<br />
dass beim Verlassen des Scope die Objekte<br />
automatisch verworfen werden.<br />
Jetzt möchte ich zu einem anderen Objekt<br />
per add mehrere Objekte hinzufügen ohne<br />
jedoch die Verantwortlichkeit für die Lebensdauer<br />
dieses Objektes zu übergeben. Per Stack-Objekt<br />
geht ja nicht, da das gleiche Objekt ich immer<br />
die gleiche Adresse hat. Also bleibt mir ja nichts<br />
anderes über als es auf dem Heap zu erzeugen, nur<br />
dann wird bei ner Exception das Objekt nicht mehr gelöscht.</p>
<p>Wie macht man sowas am besten?</p>
<p>Gruß,<br />
Referencer</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/170588/stack-objekte-in-while-schleife-und-exceptions</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 04:49:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/170588.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 17 Jan 2007 16:36:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Stack-Objekte in while-Schleife und Exceptions on Wed, 17 Jan 2007 16:36:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>der Vorteil von Stack-Objekten liegt ja darin,<br />
dass beim Verlassen des Scope die Objekte<br />
automatisch verworfen werden.<br />
Jetzt möchte ich zu einem anderen Objekt<br />
per add mehrere Objekte hinzufügen ohne<br />
jedoch die Verantwortlichkeit für die Lebensdauer<br />
dieses Objektes zu übergeben. Per Stack-Objekt<br />
geht ja nicht, da das gleiche Objekt ich immer<br />
die gleiche Adresse hat. Also bleibt mir ja nichts<br />
anderes über als es auf dem Heap zu erzeugen, nur<br />
dann wird bei ner Exception das Objekt nicht mehr gelöscht.</p>
<p>Wie macht man sowas am besten?</p>
<p>Gruß,<br />
Referencer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1211509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211509</guid><dc:creator><![CDATA[ReferenceProblem]]></dc:creator><pubDate>Wed, 17 Jan 2007 16:36:48 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Objekte in while-Schleife und Exceptions on Wed, 17 Jan 2007 16:44:49 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ein bisschen Code wäre hilfreich...<br />
Zum Problem: Da du &quot;ReferenceProblem&quot; heißt denke ich das du die Objekte per Referenz übergibts. Übergib sie in deinem Fall per Value.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1211518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211518</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 17 Jan 2007 16:44:49 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Objekte in while-Schleife und Exceptions on Wed, 17 Jan 2007 16:46:10 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Wenn du z.B. ein std::vector nimmst, kannst du mehrere Stack-Instanzen zusammenfassen ohne dich um deren Freigabe zu kümmern.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1211520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211520</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Wed, 17 Jan 2007 16:46:10 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Objekte in while-Schleife und Exceptions on Wed, 17 Jan 2007 17:40:18 GMT]]></title><description><![CDATA[<p>Also so geht es ja nicht, da alle Objekte die gleiche Adresse haben...</p>
<pre><code class="language-cpp">ObjectA a = ObjectA();
for(int i=0; i&lt;6; ++i){
   ObjectB b = ObjectB();
   a.add(b); // void add(ObjectA&amp; a);
}
</code></pre>
<p>So krieg ich Probleme mit der Freigabe, falls irgendwo ne Exception fliegt:</p>
<pre><code class="language-cpp">ObjectA a = ObjectA();
for(int i=0; i&lt;6; ++i){
   ObjectB* b = new ObjectB();
   a.add(*b);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1211544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211544</guid><dc:creator><![CDATA[ReferenceProblem]]></dc:creator><pubDate>Wed, 17 Jan 2007 17:40:18 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Objekte in while-Schleife und Exceptions on Wed, 17 Jan 2007 17:42:07 GMT]]></title><description><![CDATA[<p>Im 2. Fall natürlich immer <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="🙂"
    /><br />
nicht nur bei ner Exception...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1211545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211545</guid><dc:creator><![CDATA[ReferenceProblem]]></dc:creator><pubDate>Wed, 17 Jan 2007 17:42:07 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Objekte in while-Schleife und Exceptions on Wed, 17 Jan 2007 17:55:13 GMT]]></title><description><![CDATA[<p>im ersten beispiel haben die objekte nicht immer dieselbe adresse. es kann passieren, ist aber nicht garantiert.</p>
<p>und so wie dein problem klingt, wärs vielleicht sinnvoll einfach mit kopien (by value, wie von freak_coder schon vorgeschlagen) zu arbeiten.</p>
<pre><code class="language-cpp">void add(Object o);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1211554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211554</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Wed, 17 Jan 2007 17:55:13 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Objekte in while-Schleife und Exceptions on Wed, 17 Jan 2007 18:57:32 GMT]]></title><description><![CDATA[<p>Dann krieg ich aber Probleme mit pure virtual...</p>
<p>Oder liegt in diesem Fall schlechtes Design vor?</p>
<p>thordk schrieb:</p>
<blockquote>
<p>im ersten beispiel haben die objekte nicht immer dieselbe adresse. es kann passieren, ist aber nicht garantiert.</p>
</blockquote>
<p>Gibt es ne Regel, wann es so ist und wann nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1211586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211586</guid><dc:creator><![CDATA[ReferenceProblem]]></dc:creator><pubDate>Wed, 17 Jan 2007 18:57:32 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Objekte in while-Schleife und Exceptions on Wed, 17 Jan 2007 20:34:45 GMT]]></title><description><![CDATA[<p>ReferenceProblem schrieb:</p>
<blockquote>
<p>Gibt es ne Regel, wann es so ist und wann nicht?</p>
</blockquote>
<p>nicht dass ich wüsste.</p>
<p>das lokale objekt wird bei verlassen des scope zerstört. das geschieht bei jedem schleifendurchlauf. beim nächsten aufruf wird sie wieder angelegt. dabei könnte sie u.u. an derselben stelle im speicher angelegt werden und vielleicht macht nen compiler das auch so beim optimieren. aber garantiert ist da nix.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1211623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211623</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Wed, 17 Jan 2007 20:34:45 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Objekte in while-Schleife und Exceptions on Wed, 17 Jan 2007 23:29:00 GMT]]></title><description><![CDATA[<p>thordk schrieb:</p>
<blockquote>
<p>ReferenceProblem schrieb:</p>
<blockquote>
<p>Gibt es ne Regel, wann es so ist und wann nicht?</p>
</blockquote>
<p>nicht dass ich wüsste.</p>
<p>das lokale objekt wird bei verlassen des scope zerstört. das geschieht bei jedem schleifendurchlauf. beim nächsten aufruf wird sie wieder angelegt. dabei könnte sie u.u. an derselben stelle im speicher angelegt werden und vielleicht macht nen compiler das auch so beim optimieren. aber garantiert ist da nix.</p>
</blockquote>
<p>Probier einfach nen kleines Beispielprogramm zu basteln wo die Adresse NICHT gleich ist. Würde mich wundern wenn das recht einfach geht <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="😉"
    /><br />
Garantie gibts trotzdem keine, d.h. man sollte sich auch nicht drauf verlassen.</p>
<p>Und es ist ziemlich wurscht in dem Fall, da es auch nix helfen würde wenn sich die Adresse jedes mal ändert -- wenn die Schleife bei Durchlauf 10 ist sind die 9 Objekte die davor &quot;dort gelebt haben&quot; schon längst zerstört und deine collection hält 9 dangling pointers. Solange diese dangling pointers nicht dereferenziert oder rumgereicht oder sonstwie &quot;angegriffen&quot; werden ist das OK, bloss dann wäre die ganze collection fürn Hugo.</p>
<p>@ReferenceProblem:</p>
<p>Ein paar Ansätze:<br />
* Du könntest shared ownership verwenden (z.b. mit boost::shared_ptr)<br />
* Du könntest (member) function pointer statt virtual pure verwenden<br />
* Du könntest nen Guard verwenden</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1211687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211687</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 17 Jan 2007 23:29:00 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Objekte in while-Schleife und Exceptions on Wed, 17 Jan 2007 23:46:25 GMT]]></title><description><![CDATA[<p>Hallo hustbaer,</p>
<p>ich mach mir mal Gedanken über deine Vorschläge...<br />
Allerdings kann ich mit</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>* Du könntest nen Guard verwenden</p>
</blockquote>
<p>garnichts anfangen.<br />
Ich kenn nur Include-Guards und mit der Suche bin ich auch nicht<br />
fündig geworden</p>
<p>Kann mir jemand erklären, was ein Guard ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1211692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211692</guid><dc:creator><![CDATA[ReferenceProblem]]></dc:creator><pubDate>Wed, 17 Jan 2007 23:46:25 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Objekte in while-Schleife und Exceptions on Thu, 18 Jan 2007 07:58:18 GMT]]></title><description><![CDATA[<p>thordk schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">void add(Object o);
</code></pre>
</blockquote>
<p>ReferenceProblem schrieb:</p>
<blockquote>
<p>Dann krieg ich aber Probleme mit pure virtual...</p>
</blockquote>
<p>Kannst Du das mal kurz erklären ?<br />
Mir fällt so spontan kein Fall ein, wo das zusammenfallen könnte ...</p>
<p>Außerdem ist mir nicht klar, was Deine Klasse in der Memberfunktion mit der Referenz macht ....</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1211740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211740</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 18 Jan 2007 07:58:18 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Objekte in while-Schleife und Exceptions on Thu, 18 Jan 2007 10:31:44 GMT]]></title><description><![CDATA[<p>Vielleicht steh ich aufm Schlauch, aber<br />
bei nem einfachen Listener ist das doch so...</p>
<p>Denn bei pure virual hast du ja keinen verwendbaren Copy-Konstruktor</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1211867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211867</guid><dc:creator><![CDATA[ReferenceProblem]]></dc:creator><pubDate>Thu, 18 Jan 2007 10:31:44 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Objekte in while-Schleife und Exceptions on Thu, 18 Jan 2007 12:07:06 GMT]]></title><description><![CDATA[<p>ReferenceProblem schrieb:</p>
<blockquote>
<p>...hast du ja keinen verwendbaren Copy-Konstruktor</p>
</blockquote>
<p>Ach so - Deine Klasse hat keinen CopyCtor. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
<p>Das hatte ich nicht mit &quot;pure virtual&quot; verbunden (dachte da eher an einzelne Memberfunktionen) ....</p>
<p>Aber so stimmt das natürlich.</p>
<p>Danke,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1211945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211945</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 18 Jan 2007 12:07:06 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Objekte in while-Schleife und Exceptions on Thu, 18 Jan 2007 17:39:26 GMT]]></title><description><![CDATA[<p>Ein Guard ist ne (mehr oder weniger) kleine Hilfsklasse die dafür sorgt dass gewisse Dinge immer gemacht werden/nicht gemacht werden können.<br />
z.B. könntest du dir eine Guard Klasse programmieren der du Zeiger auf deine Instanzen übergibst, und die dann ownership übernimmt. Weiters teilst du dieser Guard Klasse mit welcher anderen Collection du diese Zeiger übergibst, damit die Guard Klasse vor dem löschen der Objekte diese auch wieder aus der Collection entfernen kann.</p>
<p>Pseudocode:</p>
<pre><code>class Guard
{
    Guard(Collection&amp; c)
        : m_collection(c)
    {
    }

    ~Guard()
    {
        for all Objects o in m_objects
        {
            m_collection.Remove(o);
            delete o;
        }
    }

    void AddLocalToCollection(Object* o)
    {
        m_objects.push_back(o);
        m_collection.Add(o);
    }

    Collection&amp; m_collection;
    vector&lt;Object*&gt; m_objects;
}
</code></pre>
<p>So inetwa</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212192</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 18 Jan 2007 17:39:26 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Objekte in while-Schleife und Exceptions on Thu, 18 Jan 2007 22:34:19 GMT]]></title><description><![CDATA[<p>Hallo HustBaer...</p>
<p>Vielen Dank für die ausführliche Erklärung!!!</p>
<p>Eigentlich ganz easy <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1212361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212361</guid><dc:creator><![CDATA[ReferenceProblem]]></dc:creator><pubDate>Thu, 18 Jan 2007 22:34:19 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Objekte in while-Schleife und Exceptions on Fri, 19 Jan 2007 00:02:54 GMT]]></title><description><![CDATA[<p>Argh!<br />
AddLocalToCollection ist ein scheiss Name, da ist mir wohl noch dein &quot;Stack Objekte&quot; im Kopf rumgeschwirrt - is ja aber nicht &quot;local&quot; sondern &quot;ge-newt&quot; (schönes Wort <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="😃"
    /> ). Sollte vielleicht besser einfach nur Add oder AddAndTakeOwnership heissen.</p>
<p>Und die Sequenz &quot;push_back&quot; + &quot;Add&quot; ist nicht exception-safe, ist so vielleicht besser:</p>
<pre><code>class Guard
{
    Guard(Collection&amp; c)
        : m_collection(c)
    {
    }

    ~Guard()
    {
        for all Objects o in m_objects
        {
            if (o)
            {
                m_collection.Remove(o);
                delete o;
            }
        }
    }

    void AddAndTakeOwnership(Object* p)
    {
        auto_ptr&lt;Object&gt; guard(p); // damit o in jedem Fall gelöscht wird

        m_objects.push_back(0);
        m_collection.Add(p);

        // jetzt kann nixe mehr schiefgehen
        guard.release();
        m_objects.back() = p;
    }

    Collection&amp; m_collection;
    vector&lt;Object*&gt; m_objects;
}
</code></pre>
<p>Is etwas gefrickelt, dafür aber jetzt exception safe <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/1212392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212392</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 19 Jan 2007 00:02:54 GMT</pubDate></item><item><title><![CDATA[Reply to Stack-Objekte in while-Schleife und Exceptions on Fri, 19 Jan 2007 08:15:13 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>...aber jetzt exception safe <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>Dazu noch eine Bemerkung <strong>@ReferenceProblem</strong>: Du solltest Dir auch überlegen, was der Aufrufer Deiner Funktion erwarten soll, wenn er eine Exception &quot;zurückbekommt&quot; ... welchen Zustand hat dann der Container ? Welchen die betroffene(n) Klasse(n) ?<br />
Das klingt erstmal trivial, aber wenn man sich das genauer ansieht, entwickelt sich eine größere Herausforderung....</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212445</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 19 Jan 2007 08:15:13 GMT</pubDate></item></channel></rss>