<?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[Auf Member eines zerstörten Objektes zugreifen funktioniert]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich glaub ich hab sie nicht mehr alle.</p>
<pre><code class="language-cpp">void CheckBounceFrameListener::remove(SceneObject ch)
{
        auto vecPos = std::find(sceneObjects.begin(),
                                sceneObjects.end(),
                                ch);
        if(vecPos != sceneObjects.end())
                Singleton.sceneObjects.erase(vecPos);

        delete ch.mRigidBody; // &lt;&lt;- Hier
        ch.mRigidBody-&gt;getSceneNode()-&gt;getParentSceneNode()-&gt;removeAndDestroyChild(ch.mRigidBody-&gt;getSceneNode()-&gt;getName());// &lt;&lt;- Und da
}
</code></pre>
<p>Man beachte Zeile <strong>9 und 10</strong>.<br />
Komischerweise funktioniert das Problemlos, glaube ich zumindest...<br />
Wenn ich die beiden Zeilen vertausche, also zuerst greife ich auf den Member zu und zerstöre dann das Objekt, funktioniert es nicht! Oben wird also zuerst <code>ch.mRigidBody</code> zerstört, anschließend greife ich auf eine Funktion zu, die auf eine Membervariable zugreift - was ja mit dem ungültigen <code>this</code> Pointer theoretisch nur schiefgehen kann <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Wie kann das angehen?</p>
<p>(Für mehr Code bitte einfach nachfragen)</p>
<p>MfG</p>
<p>P. S.: Ich übergebe keine Referenz, weil SceneObject nur zwei Pointer als Member hat, also so groß wie ein <code>long</code> sein dürte... :d</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/305478/auf-member-eines-zerstörten-objektes-zugreifen-funktioniert</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 19:59:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305478.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 30 Jun 2012 09:09:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Auf Member eines zerstörten Objektes zugreifen funktioniert on Sat, 30 Jun 2012 09:11:02 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich glaub ich hab sie nicht mehr alle.</p>
<pre><code class="language-cpp">void CheckBounceFrameListener::remove(SceneObject ch)
{
        auto vecPos = std::find(sceneObjects.begin(),
                                sceneObjects.end(),
                                ch);
        if(vecPos != sceneObjects.end())
                Singleton.sceneObjects.erase(vecPos);

        delete ch.mRigidBody; // &lt;&lt;- Hier
        ch.mRigidBody-&gt;getSceneNode()-&gt;getParentSceneNode()-&gt;removeAndDestroyChild(ch.mRigidBody-&gt;getSceneNode()-&gt;getName());// &lt;&lt;- Und da
}
</code></pre>
<p>Man beachte Zeile <strong>9 und 10</strong>.<br />
Komischerweise funktioniert das Problemlos, glaube ich zumindest...<br />
Wenn ich die beiden Zeilen vertausche, also zuerst greife ich auf den Member zu und zerstöre dann das Objekt, funktioniert es nicht! Oben wird also zuerst <code>ch.mRigidBody</code> zerstört, anschließend greife ich auf eine Funktion zu, die auf eine Membervariable zugreift - was ja mit dem ungültigen <code>this</code> Pointer theoretisch nur schiefgehen kann <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Wie kann das angehen?</p>
<p>(Für mehr Code bitte einfach nachfragen)</p>
<p>MfG</p>
<p>P. S.: Ich übergebe keine Referenz, weil SceneObject nur zwei Pointer als Member hat, also so groß wie ein <code>long</code> sein dürte... :d</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228618</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 30 Jun 2012 09:11:02 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Member eines zerstörten Objektes zugreifen funktioniert on Sat, 30 Jun 2012 09:15:54 GMT]]></title><description><![CDATA[<p>Was heißt &quot;funktioniert nicht&quot;!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228620</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 30 Jun 2012 09:15:54 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Member eines zerstörten Objektes zugreifen funktioniert on Sat, 30 Jun 2012 09:17:50 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void CheckBounceFrameListener::remove(SceneObject ch)
{
        auto vecPos = std::find(sceneObjects.begin(),
                                sceneObjects.end(),
                                ch);
        if(vecPos != sceneObjects.end())
                Singleton.sceneObjects.erase(vecPos);

        delete ch.mRigidBody; // &lt;&lt;- Hier
        ch.mRigidBody-&gt;getSceneNode()-&gt;getParentSceneNode()-&gt;removeAndDestroyChild(ch.mRigidBody-&gt;getSceneNode()-&gt;getName());// &lt;&lt;- Und da
}
</code></pre>
<p>Komischerweise funktioniert das Problemlos.</p>
</blockquote>
<p>Nur weil man einen Speicher freigibt, heißt das nicht, dass er 1ms später sofort von irgendwas anderem komplett überschrieben wird.</p>
<p>Hacker schrieb:</p>
<blockquote>
<p>Wenn ich die beiden Zeilen vertausche, also zuerst greife ich auf den Member zu und zerstöre dann das Objekt, funktioniert es nicht!</p>
</blockquote>
<p>Ohne kompilierbares Beispiel kann ich das jetzt nicht nachvollziehen/nachprüfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228621</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 30 Jun 2012 09:17:50 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Member eines zerstörten Objektes zugreifen funktioniert on Sat, 30 Jun 2012 09:26:57 GMT]]></title><description><![CDATA[<p>Funktioniert nicht heißt, <strong>Absturz</strong>, der sogar einen Kaltstart erfordern kann.<br />
Natürlich kann ich kein kompilierbares Beispiel vorführen, aber dots Antwort war eigentlich schon perfekt. Es kann gut sein, dass im Destruktor von mRigidBody auf einen Member wie die Scenenode zugegriffen werden kann, also darf es davor nicht zerstört werden. Wenn aber der Speicher gültig bleibt...</p>
<p><strong>Lösung</strong>: Davor Zeiger auf Scenenode (die btw. unabhängig von meinem zu zerstörenden <code>mRigidBody</code> existiert) nehmen, zerstören und anschließend mit Zeiger arbeiten.</p>
<p>Danke für die Hilfe <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/2228622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228622</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 30 Jun 2012 09:26:57 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Member eines zerstörten Objektes zugreifen funktioniert on Sat, 30 Jun 2012 09:29:53 GMT]]></title><description><![CDATA[<p>so:</p>
<pre><code class="language-cpp">Ogre::SceneNode* scnptr = ch.mRigidBody-&gt;getSceneNode();
        delete ch.mRigidBody;
        scnptr-&gt;getParentSceneNode()-&gt;removeAndDestroyChild(scnptr-&gt;getName());
</code></pre>
<p>Funktioniert, dürfte immer funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228624</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 30 Jun 2012 09:29:53 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Member eines zerstörten Objektes zugreifen funktioniert on Sat, 30 Jun 2012 09:30:43 GMT]]></title><description><![CDATA[<p>*snip*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228625</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 30 Jun 2012 09:30:43 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Member eines zerstörten Objektes zugreifen funktioniert on Sat, 30 Jun 2012 10:44:44 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">if(vecPos != sceneObjects.end())
                Singleton.sceneObjects.erase(vecPos);
</code></pre>
<p>Die Abfrage ist nicht nötig.<br />
Singletons sind Mist.<br />
<code>Singleton.sceneObjects</code> ist dasselbe Objekt wie einfach <code>sceneObjects</code> ?</p>
<pre><code class="language-cpp">delete ch.mRigidBody; // &lt;&lt;- Hier
</code></pre>
<p><code>delete</code> benutzt man nicht.<br />
Wie kommst du eigentlich auf die Idee, eine Ressource einer fremden Klasse zu löschen?</p>
<p>Hacker schrieb:</p>
<blockquote>
<p>P. S.: Ich übergebe keine Referenz, weil SceneObject nur zwei Pointer als Member hat, also so groß wie ein <code>long</code> sein dürte... :d</p>
</blockquote>
<p>Seltsame Rechnung:<br />
<code>sizeof(void *)</code> = 8<br />
<code>sizeof(long)</code> = 8<br />
2 * 8 != 8</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228640</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Sat, 30 Jun 2012 10:44:44 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Member eines zerstörten Objektes zugreifen funktioniert on Sat, 30 Jun 2012 12:09:38 GMT]]></title><description><![CDATA[<p>1. Ja, da hab ich mich mit den Pointergrößen verrechnet. Übrigens ist bei meinem Compiler ein Zeiger 4 Bytes groß, ich kompiliere mit einem 32-Bit MinGW. <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 />
2.</p>
<blockquote>
<p>Wie kommst du eigentlich auf die Idee, eine Ressource einer fremden Klasse zu löschen?</p>
</blockquote>
<p>Wie kommst du darauf dass das eine <strong>fremde Klasse</strong> ist? Es ist eine von mir erstellte <strong>Datenstruktur</strong>, die wegen Punkt 4 nicht selber Speicher freigeben darf <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>3. Die Funktion dessen Code ich gezeigt habe ist keine Memberfunktion der Klasse des Singletons. Überhaupt: <em>Singletons sind Mist</em> ist keine Aussage. Ich finde, es ist ein sinnvolles Designpattern, und Designkritiken wollte ich auch gar nicht. <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>4. Ich kann <code>delete</code> so benutzen wie ich will. Ich muss selbst über die Lebenszeiten der Objekte entscheiden, weil sie sich sonst in die Quere kommen.<br />
Also gehen weder Smart-Pointer noch Boosts Pointer-Container. Aber da bin ich mir nicht sicher, ich muss immer an refactoring denken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228654</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 30 Jun 2012 12:09:38 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Member eines zerstörten Objektes zugreifen funktioniert on Sat, 30 Jun 2012 12:16:06 GMT]]></title><description><![CDATA[<p>der code ist ja schrecklich</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228659</guid><dc:creator><![CDATA[refactoring required]]></dc:creator><pubDate>Sat, 30 Jun 2012 12:16:06 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Member eines zerstörten Objektes zugreifen funktioniert on Sat, 30 Jun 2012 12:20:22 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>3. Die Funktion dessen Code ich gezeigt habe ist keine Memberfunktion der Klasse des Singletons. Überhaupt: <em>Singletons sind Mist</em> ist keine Aussage. Ich finde, es ist ein sinnvolles Designpattern, und Designkritiken wollte ich auch gar nicht. <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>
</blockquote>
<p>Singleton ist eine Krankheit und kein Designpattern. Insbesodnere gilt es als Paradebeispiel eines Antipatterns.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228661</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 30 Jun 2012 12:20:22 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Member eines zerstörten Objektes zugreifen funktioniert on Sat, 30 Jun 2012 12:46:43 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">auto vecPos = std::find(sceneObjects.begin(), 
                                sceneObjects.end(), 
                                ch); 
        if(vecPos != sceneObjects.end()) 
                Singleton.sceneObjects.erase(vecPos);
</code></pre>
<p>Klar, das ist hässlich.</p>
<pre><code class="language-cpp">std::remove(sceneObjects.begin(),
                    sceneObjects.end(),
                    ch);
</code></pre>
<p>Ich refactore gerade alles auf <code>std::unique_ptr</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228669</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 30 Jun 2012 12:46:43 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Member eines zerstörten Objektes zugreifen funktioniert on Sun, 01 Jul 2012 15:35:08 GMT]]></title><description><![CDATA[<p>Edit: lol. Der obige Code ist peinlich falsch...</p>
<p>Shame on me.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228685</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 01 Jul 2012 15:35:08 GMT</pubDate></item><item><title><![CDATA[Reply to Auf Member eines zerstörten Objektes zugreifen funktioniert on Sun, 01 Jul 2012 15:30:00 GMT]]></title><description><![CDATA[<p>So, bin fertig. Und das Ergebnis des refactoring ist mehr als befriedigend: viele Zeilen Code verloren, die Klasse <code>SceneObject</code> brauche ich gar nicht mehr, und die Speicherfreigabe ist jetzt sicher mit einem Pointer Container und ein oder zwei <code>unique_ptr</code> s.</p>
<p>Danke! <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="😃"
    /><br />
Ich werde mich das nächste mal ohrfeigen, wenn ich wieder <code>delete</code> in meinem Code schreibe .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2228916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2228916</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 01 Jul 2012 15:30:00 GMT</pubDate></item></channel></rss>