<?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[genullter Zeiger auf gelöschtes Objekt und es lässt sich benutzen???]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich muss vorrausschicken, ich komme ursprünglich von der Java-Programmierung und lese gerade das hervorragende Buch &quot;Effective C++&quot; von Meyers.<br />
Daher beschäftige ich mich mit der Speicherverwaltung.</p>
<p>Habe nun folgende Verständnisfrage:<br />
Ich habe eine Klasse mit einer konstanten Methode:</p>
<p>TestClass.h :</p>
<pre><code class="language-cpp">class TestClass
{
public:
	TestClass();
	~TestClass();
	const void doOutput();
};
</code></pre>
<p>TestClass.cpp :</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

const void TestClass::doOutput(){
	std::cout &lt;&lt; &quot;Miau!&quot;;
}
</code></pre>
<p>Und hier die main.cpp:</p>
<pre><code class="language-cpp">int main()
{
	TestClass *ptr = new TestClass();
	ptr-&gt;doOutput();
	delete ptr;
	ptr = 0;
	ptr-&gt;doOutput();
	return 0;
}
</code></pre>
<p>Was mich völlig umhaut, ist dass das nicht nur klaglos kompiliert wird, sondern sogar läuft (Zweimal Miau! in der Konsole) unter Windows mit MSVC++, unter Windows mit gcc 3.x von MinGW und unter Linux mit gcc 4.2.1.<br />
Dass delete den Speicher nur freigibt und da nix passiert, solange nichts neues geschrieben wird, ist mir klar. Aber wenn der Zeiger genullt wird, rufe ich doch dann praktisch null.doOutput() auf, und das kann doch nicht gehen?<br />
Dass c++ keine runtime-exceptions macht, daran habe ich mich ja mittlerweile gewöhnt, aber das sowas klaglos kompiliert wird, wundert mich doch arg!</p>
<p>Ist das ein undefiniertes Verhalten oder liegt das an wohlwollenden Kompilern?</p>
<p>Gruß,<br />
Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/208847/genullter-zeiger-auf-gelöschtes-objekt-und-es-lässt-sich-benutzen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 06:39:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/208847.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 23 Mar 2008 16:40:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to genullter Zeiger auf gelöschtes Objekt und es lässt sich benutzen??? on Sun, 23 Mar 2008 16:48:52 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich muss vorrausschicken, ich komme ursprünglich von der Java-Programmierung und lese gerade das hervorragende Buch &quot;Effective C++&quot; von Meyers.<br />
Daher beschäftige ich mich mit der Speicherverwaltung.</p>
<p>Habe nun folgende Verständnisfrage:<br />
Ich habe eine Klasse mit einer konstanten Methode:</p>
<p>TestClass.h :</p>
<pre><code class="language-cpp">class TestClass
{
public:
	TestClass();
	~TestClass();
	const void doOutput();
};
</code></pre>
<p>TestClass.cpp :</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

const void TestClass::doOutput(){
	std::cout &lt;&lt; &quot;Miau!&quot;;
}
</code></pre>
<p>Und hier die main.cpp:</p>
<pre><code class="language-cpp">int main()
{
	TestClass *ptr = new TestClass();
	ptr-&gt;doOutput();
	delete ptr;
	ptr = 0;
	ptr-&gt;doOutput();
	return 0;
}
</code></pre>
<p>Was mich völlig umhaut, ist dass das nicht nur klaglos kompiliert wird, sondern sogar läuft (Zweimal Miau! in der Konsole) unter Windows mit MSVC++, unter Windows mit gcc 3.x von MinGW und unter Linux mit gcc 4.2.1.<br />
Dass delete den Speicher nur freigibt und da nix passiert, solange nichts neues geschrieben wird, ist mir klar. Aber wenn der Zeiger genullt wird, rufe ich doch dann praktisch null.doOutput() auf, und das kann doch nicht gehen?<br />
Dass c++ keine runtime-exceptions macht, daran habe ich mich ja mittlerweile gewöhnt, aber das sowas klaglos kompiliert wird, wundert mich doch arg!</p>
<p>Ist das ein undefiniertes Verhalten oder liegt das an wohlwollenden Kompilern?</p>
<p>Gruß,<br />
Philipp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1479204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1479204</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Sun, 23 Mar 2008 16:48:52 GMT</pubDate></item><item><title><![CDATA[Reply to genullter Zeiger auf gelöschtes Objekt und es lässt sich benutzen??? on Sun, 23 Mar 2008 16:46:46 GMT]]></title><description><![CDATA[<blockquote>
<p>Dass delete den Speicher nur freigibt und da nix passiert, solange nichts neues geschrieben wird, ist mir klar. Aber wenn der Zeiger genullt wird, rufe ich doch dann praktisch null.doOutput() auf, und das kann doch nicht gehen?</p>
</blockquote>
<p>Das hatte ich auch mal. Das liegt daran, dass du keine Daten hast und auch keine manipulierst in der Member Funktion. Darum kann der 0-Zeiger ohne weiteres einfach etwas ausgeben. Wenn du jetzt mal Daten miteinbeziehst, wird es nicht mehr gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1479208</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1479208</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 23 Mar 2008 16:46:46 GMT</pubDate></item><item><title><![CDATA[Reply to genullter Zeiger auf gelöschtes Objekt und es lässt sich benutzen??? on Sun, 23 Mar 2008 16:54:53 GMT]]></title><description><![CDATA[<p>Das Verhalten ist undefiniert - warum es aber funktioniert ist simpel:</p>
<p>foo.bar();<br />
ist nur eine andere Schreibweise fuer bar(&amp;foo);</p>
<p>Und wenn bar nun nie auf foo zugreift, kommt es nie zu einem Fehler.</p>
<p>Natuerlich ist das nicht garantiert - wenn naemlich bar() Debug Infos schreiben will, dann kann das Programm leicht abstuerzen - oder wenn sonst wie auf foo zugegriffen wird.</p>
<p>Das ist das tueckische an Zeigern: nur weil das Programm laeuft muss es noch lange nicht korrekt sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1479215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1479215</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sun, 23 Mar 2008 16:54:53 GMT</pubDate></item><item><title><![CDATA[Reply to genullter Zeiger auf gelöschtes Objekt und es lässt sich benutzen??? on Sun, 23 Mar 2008 22:09:48 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Wenn du jetzt mal Daten miteinbeziehst, wird es nicht mehr gehen.</p>
</blockquote>
<p>Jop das hab ich gerade ausprobiert. So macht das Sinn. Auch die Erklärung von Shade of Mine ist einleuchtend.</p>
<p>Habe jetzt mal eine private int count und eine get-Methode für diese eingeführt.<br />
Jetzt stellt sich mir nur die Frage: Warum das</p>
<pre><code class="language-cpp">int main()
{
	TestClass *ptr = new TestClass(234);
	int i=0;
	ptr-&gt;doOutput();
	cout &lt;&lt; ptr-&gt;getCount();
	delete ptr;
	ptr = 0;
	try {
		ptr-&gt;doOutput();
		i = ptr-&gt;getCount();
	}
	catch(...){
		cout &lt;&lt; &quot;Fehler!&quot;;
		i = 4711;
	}
	cout &lt;&lt; i;
	return 0;
}
</code></pre>
<p>Zu einer unbehandelten Ausnahme &quot;Zugriffsverletzung beim lesen an position 0x00&quot; führt, also der klassischen NullPointerException, um mal im Java-Jargon zu reden.<br />
Warum wird die von catch() nicht gefangen und &quot;Fehler&quot; ausgegeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1479368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1479368</guid><dc:creator><![CDATA[PhilippM]]></dc:creator><pubDate>Sun, 23 Mar 2008 22:09:48 GMT</pubDate></item><item><title><![CDATA[Reply to genullter Zeiger auf gelöschtes Objekt und es lässt sich benutzen??? on Sun, 23 Mar 2008 22:55:15 GMT]]></title><description><![CDATA[<p>Weil sowas unter den meisten Laufzeitumgebungen gar keine Exception erzeugt. Das Betriebssystem merkt, dass du auf Speicher zugreifen möchtest, der dir nicht gehört, und sagt dir, dass das nicht ok ist. Unter Unix wird das mit einem SIGSEGV Signal gemacht. Will man also eine solche Situation behandeln, dann muss man das SIGSEGV Signal auffangen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1479379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1479379</guid><dc:creator><![CDATA[Ponto]]></dc:creator><pubDate>Sun, 23 Mar 2008 22:55:15 GMT</pubDate></item><item><title><![CDATA[Reply to genullter Zeiger auf gelöschtes Objekt und es lässt sich benutzen??? on Sun, 23 Mar 2008 23:14:37 GMT]]></title><description><![CDATA[<p>In C++ treten Exceptions nur als Folge eines Funktionsaufrufes auf, nicht aber als Resultat eingebauter Operatoren (wenn man throw selbst mal ausnimmt). Zugegeben, da obiges Beispiel sowieso undefiniert ist, könnte sich eine Implementation natürlich dennoch dazu entschließen, eine Exception zu werfen (technisch nicht ganz einfach - da das Stackunwinding in diesem Falle recht kompliziert werden könnte), das geht dann aber über Standard-C++ hinaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1479391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1479391</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 23 Mar 2008 23:14:37 GMT</pubDate></item></channel></rss>