<?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[leichte verwirrung mit pointern!]]></title><description><![CDATA[<p>Hi Leute</p>
<p>Soeben haben wir, ein Kollege und ich, uns ziemlich an den kopf gefasst, da fast die gesamte C++ Ideologie mit einem Schlag über den Haufen geworfen wurde!! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title="=P"
      alt="😛"
    /> Und auch, weils hier ziemlich warm ist und wir demnach eher im roten Bereich drehen! hehe</p>
<p>Also, folgender Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
//#include &lt;boost/shared_ptr.hpp&gt;

class Fahrer
{
     protected:
        float Stundenlohn;
     public:
         Fahrer() { std::cout &lt;&lt; &quot;ctor\n&quot;;};
         ~Fahrer(){ std::cout &lt;&lt; &quot;destructor\n&quot;;};
         void Initialisiere(float Lohn) {Stundenlohn = Lohn; }; /* selbsverständlich würden wir NIE eine init()-Methode verwenden =) Nur für Testzwecke */
         float KostenProKM(void) {return(Stundenlohn / 75.0); } ;
};

int main()
{
     Fahrer *test= new Fahrer();
	Fahrer *test2= new Fahrer();
	delete test;
	delete test2;
	Fahrer *test3 = new Fahrer();
	Fahrer *test4 = new Fahrer();

	delete test3;
	delete test4;

     test-&gt;Initialisiere(34.0);
     std::cout &lt;&lt; test-&gt;KostenProKM() &lt;&lt; std::endl;

     test2-&gt;Initialisiere(34.0);
     std::cout &lt;&lt; testh2-&gt;KostenProKM() &lt;&lt; std::endl;

     test3-&gt;Initialisiere(34.0);
     std::cout &lt;&lt; test3-&gt;KostenProKM() &lt;&lt; std::endl;

     test4-&gt;Initialisiere(34.0);
     std::cout &lt;&lt; test4-&gt;KostenProKM() &lt;&lt; std::endl;

	return 0;
}
</code></pre>
<pre><code>Sessionlog:
destructor
destructor
ctor
ctor
destructor
destructor
0.453333
0.453333
0.453333
0.453333
</code></pre>
<p>Nun, wie man sehen kann, werden alle erzeugten Objekte wieder gelöscht, d.h. der Speicher wird freigegeben und ist somit ungültig für weitere Zugriffe, korrekt?<br />
Da wurden wir natürlich etwas misstrauisch, da dies all dem Gelernten total wiederspricht!<br />
Also versuchten wir uns mit Büchern und dem Internet etwas schlau zu machen und wurden dann auch fündig. In einer Referenz heisst es da, dass &quot;...der Wert des Pointers ist nach 'delete' undefiniert.&quot;.<br />
Bei GNU GCC haben wir gelesen, dass einfach die alte Adresse gespeichert bleibt, selbst wenn das Objekt nicht mehr exisitiert.</p>
<p>Kann uns hier jemand auf die Schnelle klar machen, warum wir immernoch auf die Methoden zugreifen können, obwohl die Objekte gar nicht mehr existieren?</p>
<p>Für die Hilfe danken wir schon im Voraus!<br />
mfg rox</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/154215/leichte-verwirrung-mit-pointern</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 20:25:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/154215.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 Jul 2006 12:47:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to leichte verwirrung mit pointern! on Tue, 25 Jul 2006 12:47:18 GMT]]></title><description><![CDATA[<p>Hi Leute</p>
<p>Soeben haben wir, ein Kollege und ich, uns ziemlich an den kopf gefasst, da fast die gesamte C++ Ideologie mit einem Schlag über den Haufen geworfen wurde!! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title="=P"
      alt="😛"
    /> Und auch, weils hier ziemlich warm ist und wir demnach eher im roten Bereich drehen! hehe</p>
<p>Also, folgender Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
//#include &lt;boost/shared_ptr.hpp&gt;

class Fahrer
{
     protected:
        float Stundenlohn;
     public:
         Fahrer() { std::cout &lt;&lt; &quot;ctor\n&quot;;};
         ~Fahrer(){ std::cout &lt;&lt; &quot;destructor\n&quot;;};
         void Initialisiere(float Lohn) {Stundenlohn = Lohn; }; /* selbsverständlich würden wir NIE eine init()-Methode verwenden =) Nur für Testzwecke */
         float KostenProKM(void) {return(Stundenlohn / 75.0); } ;
};

int main()
{
     Fahrer *test= new Fahrer();
	Fahrer *test2= new Fahrer();
	delete test;
	delete test2;
	Fahrer *test3 = new Fahrer();
	Fahrer *test4 = new Fahrer();

	delete test3;
	delete test4;

     test-&gt;Initialisiere(34.0);
     std::cout &lt;&lt; test-&gt;KostenProKM() &lt;&lt; std::endl;

     test2-&gt;Initialisiere(34.0);
     std::cout &lt;&lt; testh2-&gt;KostenProKM() &lt;&lt; std::endl;

     test3-&gt;Initialisiere(34.0);
     std::cout &lt;&lt; test3-&gt;KostenProKM() &lt;&lt; std::endl;

     test4-&gt;Initialisiere(34.0);
     std::cout &lt;&lt; test4-&gt;KostenProKM() &lt;&lt; std::endl;

	return 0;
}
</code></pre>
<pre><code>Sessionlog:
destructor
destructor
ctor
ctor
destructor
destructor
0.453333
0.453333
0.453333
0.453333
</code></pre>
<p>Nun, wie man sehen kann, werden alle erzeugten Objekte wieder gelöscht, d.h. der Speicher wird freigegeben und ist somit ungültig für weitere Zugriffe, korrekt?<br />
Da wurden wir natürlich etwas misstrauisch, da dies all dem Gelernten total wiederspricht!<br />
Also versuchten wir uns mit Büchern und dem Internet etwas schlau zu machen und wurden dann auch fündig. In einer Referenz heisst es da, dass &quot;...der Wert des Pointers ist nach 'delete' undefiniert.&quot;.<br />
Bei GNU GCC haben wir gelesen, dass einfach die alte Adresse gespeichert bleibt, selbst wenn das Objekt nicht mehr exisitiert.</p>
<p>Kann uns hier jemand auf die Schnelle klar machen, warum wir immernoch auf die Methoden zugreifen können, obwohl die Objekte gar nicht mehr existieren?</p>
<p>Für die Hilfe danken wir schon im Voraus!<br />
mfg rox</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1103815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103815</guid><dc:creator><![CDATA[roxor]]></dc:creator><pubDate>Tue, 25 Jul 2006 12:47:18 GMT</pubDate></item><item><title><![CDATA[Reply to leichte verwirrung mit pointern! on Tue, 25 Jul 2006 12:52:09 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>das liegt daran, das euer Compiler mit einem delete ja nicht den entsprechenden Speicher mit 0 überschreibt. Sondern der Speicherbereich wird nur als &quot;frei und wieder allokierbar&quot; markiert. Das heißt solange dort kein andere mehr reinschreibt kann noch an die Daten rangekommen werden.<br />
Allerdings ist es so oder so ungültig. Nur auf gültige Instanzen innerhalb ihrer Lebenszeit darf zugegriffen werden.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1103822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103822</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Tue, 25 Jul 2006 12:52:09 GMT</pubDate></item><item><title><![CDATA[Reply to leichte verwirrung mit pointern! on Tue, 25 Jul 2006 12:53:49 GMT]]></title><description><![CDATA[<p>Zum einen ruft ein delete nur den Destruktor auf und gibt den Speicher frei. Am Inhalt der gelöschten Variable (also die Adresse, die drinsteht) ändert sich garnichts. Das, worauf diese Adresse zeigt, ist einfach ungültig.</p>
<p>Zum zweiten, der Zugriff auf etwas ungültiges ist wie Du schon richtig herausgefunden hast undefiniert. Undefiniert bedeutet eben, es ist <strong>nicht</strong> definiert, was passiert. Dein Rechner könnte Dir eine scheuern, in China könnte ein Sack Reis umfallen, oder es funktioniert einfach (etwa weil die Speicherverwaltung den Speicher noch nicht anderweitig verwendet hat und immernoch die gültigen Werte drinstehen). Verlassen kannst Du Dich hier aber auf garnichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1103823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103823</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 25 Jul 2006 12:53:49 GMT</pubDate></item><item><title><![CDATA[Reply to leichte verwirrung mit pointern! on Tue, 25 Jul 2006 12:59:21 GMT]]></title><description><![CDATA[<p>Hey</p>
<p>Wow, das ging ja zügig! <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>Hab soeben noch was anderes ausprobiert, etwas mehr Objekte erzeugt, damit hoffenltich die freigewordenen Speicherstellen wieder beschrieben werden, und siehe da: das Gelernte stimmt also doch! <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="🙂"
    /> Er erzeugt eine Fehlermeldung (Stackdump).</p>
<p>Danke, alles wieder klar(er)! <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>mfg<br />
rox</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1103833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1103833</guid><dc:creator><![CDATA[roxor]]></dc:creator><pubDate>Tue, 25 Jul 2006 12:59:21 GMT</pubDate></item></channel></rss>