<?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[Zugriff auf Speicheradresse nach &#x27;delete&#x27; noch immer möglich]]></title><description><![CDATA[<p>Hallo</p>
<p>Wenn ich über 'delete ...' den belegten Speicher wieder freigebe, kann ich danach trotzdem noch auf diesen zugreifen.</p>
<pre><code>// Klassendefinitionen
class Point
{
public:
	float x, y, z;
	Point();
	~Point();
};

class Gallier
{
public:
	Point* position;
	Gallier();
	~Gallier();
};

// danach deren Konstruktoren und Destruktoren
Gallier::Gallier()
{
	std::cout &lt;&lt; &quot;\nConstructor of Gallier executed\n&quot;;
	position = new Point();
}

Gallier::~Gallier()
{
	std::cout &lt;&lt; &quot;\nDestructor of Gallier executed\n&quot;;
	delete position;
	position = nullptr;
}

Point::Point()
{
	std::cout &lt;&lt; &quot;\nConstructor of Point executed\n&quot;;
	x = 7.0F;
	y = 9.0F;
	z = 11.0F;
}

Point::~Point()
{
	std::cout &lt;&lt; &quot;\nDestructor of Point executed\n&quot;;
}

// und jetzt etwas damit spielen
Gallier* asterix = new Gallier();
	std::cout &lt;&lt; &quot;asterix-&gt;position-&gt;x = &quot; &lt;&lt; asterix-&gt;position-&gt;x &lt;&lt; &quot;\n&quot;;
	std::cout &lt;&lt; &quot;asterix-&gt;position-&gt;y = &quot; &lt;&lt; asterix-&gt;position-&gt;y &lt;&lt; &quot;\n&quot;;
	std::cout &lt;&lt; &quot;asterix-&gt;position-&gt;z = &quot; &lt;&lt; asterix-&gt;position-&gt;z &lt;&lt; &quot;\n&quot;;

	Point* tempPtr = asterix-&gt;position;

	asterix-&gt;position-&gt;x = 70.0F;
	asterix-&gt;position-&gt;y = 90.0F;
	asterix-&gt;position-&gt;z = 110.0F;

	delete asterix;

	// ab hier dürfte der Zugriff eigentlich nicht mehr möglich sein
	std::cout &lt;&lt; &quot;tempPtr-&gt;pos x = &quot; &lt;&lt; tempPtr-&gt;x &lt;&lt; &quot;\n&quot;;
	std::cout &lt;&lt; &quot;tempPtr-&gt;pos y = &quot; &lt;&lt; tempPtr-&gt;y &lt;&lt; &quot;\n&quot;;
	std::cout &lt;&lt; &quot;tempPtr-&gt;pos z = &quot; &lt;&lt; tempPtr-&gt;z &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>Was mich wundert: Ich kann mit tempPtr noch immer auf die korrekten Werte zugreifen, obwohl mit 'delete position' im Destruktor der Klasse 'Gallier' der Speicher wieder frei sein sollte.<br />
Ich habe den Eindruck, dass der Speicher nicht freigegeben wird, weil das System bemerkt, dass es einen weiteren Zeiger (tempPtr) gibt, der ebenfalls auf genau diese Adresse zeigt.</p>
<p>Die Ausgabe in der Konsole sieht so aus:</p>
<p>Constructor of Gallier executed</p>
<p>Constructor of Point executed<br />
asterix-&gt;position-&gt;x = 7<br />
asterix-&gt;position-&gt;y = 9<br />
asterix-&gt;position-&gt;z = 11</p>
<p>Destructor of Gallier executed</p>
<p>Destructor of Point executed<br />
tempPtr-&gt;pos x = 70<br />
tempPtr-&gt;pos y = 90<br />
tempPtr-&gt;pos z = 110</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/332486/zugriff-auf-speicheradresse-nach-delete-noch-immer-möglich</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 20:41:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332486.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 04 May 2015 06:57:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zugriff auf Speicheradresse nach &#x27;delete&#x27; noch immer möglich on Mon, 04 May 2015 07:18:30 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Wenn ich über 'delete ...' den belegten Speicher wieder freigebe, kann ich danach trotzdem noch auf diesen zugreifen.</p>
<pre><code>// Klassendefinitionen
class Point
{
public:
	float x, y, z;
	Point();
	~Point();
};

class Gallier
{
public:
	Point* position;
	Gallier();
	~Gallier();
};

// danach deren Konstruktoren und Destruktoren
Gallier::Gallier()
{
	std::cout &lt;&lt; &quot;\nConstructor of Gallier executed\n&quot;;
	position = new Point();
}

Gallier::~Gallier()
{
	std::cout &lt;&lt; &quot;\nDestructor of Gallier executed\n&quot;;
	delete position;
	position = nullptr;
}

Point::Point()
{
	std::cout &lt;&lt; &quot;\nConstructor of Point executed\n&quot;;
	x = 7.0F;
	y = 9.0F;
	z = 11.0F;
}

Point::~Point()
{
	std::cout &lt;&lt; &quot;\nDestructor of Point executed\n&quot;;
}

// und jetzt etwas damit spielen
Gallier* asterix = new Gallier();
	std::cout &lt;&lt; &quot;asterix-&gt;position-&gt;x = &quot; &lt;&lt; asterix-&gt;position-&gt;x &lt;&lt; &quot;\n&quot;;
	std::cout &lt;&lt; &quot;asterix-&gt;position-&gt;y = &quot; &lt;&lt; asterix-&gt;position-&gt;y &lt;&lt; &quot;\n&quot;;
	std::cout &lt;&lt; &quot;asterix-&gt;position-&gt;z = &quot; &lt;&lt; asterix-&gt;position-&gt;z &lt;&lt; &quot;\n&quot;;

	Point* tempPtr = asterix-&gt;position;

	asterix-&gt;position-&gt;x = 70.0F;
	asterix-&gt;position-&gt;y = 90.0F;
	asterix-&gt;position-&gt;z = 110.0F;

	delete asterix;

	// ab hier dürfte der Zugriff eigentlich nicht mehr möglich sein
	std::cout &lt;&lt; &quot;tempPtr-&gt;pos x = &quot; &lt;&lt; tempPtr-&gt;x &lt;&lt; &quot;\n&quot;;
	std::cout &lt;&lt; &quot;tempPtr-&gt;pos y = &quot; &lt;&lt; tempPtr-&gt;y &lt;&lt; &quot;\n&quot;;
	std::cout &lt;&lt; &quot;tempPtr-&gt;pos z = &quot; &lt;&lt; tempPtr-&gt;z &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>Was mich wundert: Ich kann mit tempPtr noch immer auf die korrekten Werte zugreifen, obwohl mit 'delete position' im Destruktor der Klasse 'Gallier' der Speicher wieder frei sein sollte.<br />
Ich habe den Eindruck, dass der Speicher nicht freigegeben wird, weil das System bemerkt, dass es einen weiteren Zeiger (tempPtr) gibt, der ebenfalls auf genau diese Adresse zeigt.</p>
<p>Die Ausgabe in der Konsole sieht so aus:</p>
<p>Constructor of Gallier executed</p>
<p>Constructor of Point executed<br />
asterix-&gt;position-&gt;x = 7<br />
asterix-&gt;position-&gt;y = 9<br />
asterix-&gt;position-&gt;z = 11</p>
<p>Destructor of Gallier executed</p>
<p>Destructor of Point executed<br />
tempPtr-&gt;pos x = 70<br />
tempPtr-&gt;pos y = 90<br />
tempPtr-&gt;pos z = 110</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452413</guid><dc:creator><![CDATA[Doofkopp]]></dc:creator><pubDate>Mon, 04 May 2015 07:18:30 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf Speicheradresse nach &#x27;delete&#x27; noch immer möglich on Mon, 04 May 2015 07:09:36 GMT]]></title><description><![CDATA[<p>Speicher freigeben != Speicher initialisieren<br />
da stehen einfach noch die alten Daten das ist alles</p>
<p>Warum: Es kostet einfach zu viel Zeit - und wenn du es für Fehlersuche brauchst kannst du ja selber mit nullen oder sonstigem überschreiben</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452414</guid><dc:creator><![CDATA[Gast3]]></dc:creator><pubDate>Mon, 04 May 2015 07:09:36 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf Speicheradresse nach &#x27;delete&#x27; noch immer möglich on Mon, 04 May 2015 08:04:04 GMT]]></title><description><![CDATA[<p>Doofkopp schrieb:</p>
<blockquote>
<p>Wenn ich über 'delete ...' den belegten Speicher wieder freigebe, kann ich danach trotzdem noch auf diesen zugreifen.</p>
</blockquote>
<p>Das ist reiner Zufall, wenn auch zu erwarten.</p>
<p>Streng genommen ist das Verhalten undefiniert. Praktisch ist es meistens das einfachste, den Inhalt des Speichers an der Stelle so zu lassen, wie er ist und den Bereich als &quot;verfügbar&quot; zu markieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452419</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Mon, 04 May 2015 08:04:04 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf Speicheradresse nach &#x27;delete&#x27; noch immer möglich on Mon, 04 May 2015 08:14:04 GMT]]></title><description><![CDATA[<p>Doofkopp schrieb:</p>
<blockquote>
<p>Wenn ich über 'delete ...' den belegten Speicher wieder freigebe, kann ich danach trotzdem noch auf diesen zugreifen.</p>
</blockquote>
<p>Du darfst es aber nicht (weil dir der Speicher dann nicht mehr gehört).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452422</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Mon, 04 May 2015 08:14:04 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf Speicheradresse nach &#x27;delete&#x27; noch immer möglich on Mon, 04 May 2015 09:34:19 GMT]]></title><description><![CDATA[<p>Mit anderen Worten: Genau dieser Speicher kann zufällig von einem anderen Zeiger oder auch direkt anderem Programm wieder angefordert werden. Wenn das passiert und ich mit tempPtr nochmals darauf zugreife, kann es krachen und das Programm schmiert ab.<br />
Dass noch die alten Werte drin stehen, war mir so nicht bewusst. Das erklärt allerdings tatsächlich das Verhalten.</p>
<p>OK, von daher alles bestens. Ich danke allen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452430</guid><dc:creator><![CDATA[Doofkopp]]></dc:creator><pubDate>Mon, 04 May 2015 09:34:19 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf Speicheradresse nach &#x27;delete&#x27; noch immer möglich on Mon, 04 May 2015 11:11:03 GMT]]></title><description><![CDATA[<p>Doofkopp schrieb:</p>
<blockquote>
<p>Wenn das passiert und ich mit tempPtr nochmals darauf zugreife, kann es krachen und das Programm schmiert ab.</p>
</blockquote>
<p>Ja, es kann. Oder noch viel schlimmer: Es kracht nix und das Programm läuft weiter, rechnet aber Unsinn aus.</p>
<p>Doofkopp schrieb:</p>
<blockquote>
<p>Dass noch die alten Werte drin stehen, war mir so nicht bewusst. Das erklärt allerdings tatsächlich das Verhalten.</p>
</blockquote>
<p>Bei MSVC wird in DEBUG Builds der Speicherinhalt beim Freigeben überschrieben - eben damit man solche Fehler schneller findet.<br />
Würde mich fast wundern wenn andere Compiler (bzw. Library Implementierungen) das nicht auch könnten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452438</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 04 May 2015 11:11:03 GMT</pubDate></item></channel></rss>