<?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[Problem mit Speicherbereinung via delete]]></title><description><![CDATA[<p>In folgende Pseudocode erstelle ich in einer Funktion via new ein Objekt, wessen Zeiger in main() weiterverwendet werden soll. Doch nach Erfüllung des Zweckes und dem darauffolgenden &quot;delete&quot;-Aufrufes befindet sich das Objekt augenscheinlich noch immer im Speicher, wie die untenstehende Ausgabe verdeutlicht.</p>
<pre><code>Object *create_new_obj() {
	Object *new_obj = new Object;

	return new_obj;
}

int delete_obj(Object *obj) {
	delete obj;
	obj = NULL;
	return 0;
}

int main(void) {
	Object *obj = create_new_obj();
	printf(&quot;machwas1: %i\n&quot;, obj-&gt;machWas());

	delete_obj(obj);

	printf(&quot;machwas2: %i\n&quot;, obj-&gt;machWas());

	return 0;
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>machwas1: 23
machwas2: 23
</code></pre>
<p>Allem Anschein nach wird nicht das eigentliche Objekt gelöscht, sondern vielmehr nur eine Kopie. Kann mir jemand behilflich sein und mir auf die Sprünge helfen, wie ich das dynamisch erstellte Objekt wieder (sauber) entfernen kann?</p>
<p>mfg Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/135255/problem-mit-speicherbereinung-via-delete</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 22:17:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/135255.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 31 Jan 2006 20:22:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Speicherbereinung via delete on Tue, 31 Jan 2006 20:22:06 GMT]]></title><description><![CDATA[<p>In folgende Pseudocode erstelle ich in einer Funktion via new ein Objekt, wessen Zeiger in main() weiterverwendet werden soll. Doch nach Erfüllung des Zweckes und dem darauffolgenden &quot;delete&quot;-Aufrufes befindet sich das Objekt augenscheinlich noch immer im Speicher, wie die untenstehende Ausgabe verdeutlicht.</p>
<pre><code>Object *create_new_obj() {
	Object *new_obj = new Object;

	return new_obj;
}

int delete_obj(Object *obj) {
	delete obj;
	obj = NULL;
	return 0;
}

int main(void) {
	Object *obj = create_new_obj();
	printf(&quot;machwas1: %i\n&quot;, obj-&gt;machWas());

	delete_obj(obj);

	printf(&quot;machwas2: %i\n&quot;, obj-&gt;machWas());

	return 0;
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>machwas1: 23
machwas2: 23
</code></pre>
<p>Allem Anschein nach wird nicht das eigentliche Objekt gelöscht, sondern vielmehr nur eine Kopie. Kann mir jemand behilflich sein und mir auf die Sprünge helfen, wie ich das dynamisch erstellte Objekt wieder (sauber) entfernen kann?</p>
<p>mfg Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/982504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/982504</guid><dc:creator><![CDATA[Stefan_Guest]]></dc:creator><pubDate>Tue, 31 Jan 2006 20:22:06 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherbereinung via delete on Tue, 31 Jan 2006 20:29:19 GMT]]></title><description><![CDATA[<p>Ist doch entfernt, nur der Zeiger zeigt halt noch drauf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/982514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/982514</guid><dc:creator><![CDATA[aaa]]></dc:creator><pubDate>Tue, 31 Jan 2006 20:29:19 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherbereinung via delete on Tue, 31 Jan 2006 20:32:50 GMT]]></title><description><![CDATA[<p>Sollte er aber nicht... oder hab' ich da was falsch verstanden?</p>
<pre><code>obj = NULL;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/982516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/982516</guid><dc:creator><![CDATA[Stefan_Guest]]></dc:creator><pubDate>Tue, 31 Jan 2006 20:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherbereinung via delete on Tue, 31 Jan 2006 20:39:43 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>benutzt den Debugger.<br />
Dann wirst du sehen, das du nur den lokalen Zeiger obj in der Funktion delete_obj auf NULL setzt.<br />
Davon ist aber nicht der zeiger obj aus der main-Funktion betroffen, der besitzt seine Adresse noch. Und dort wird danach ein unerlaubter Zugriff auf einen ungültigen Speicherbereich ausgeführt. Das kann gutgehen, wird es aber meistens nicht.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/982532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/982532</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Tue, 31 Jan 2006 20:39:43 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherbereinung via delete on Tue, 31 Jan 2006 20:53:02 GMT]]></title><description><![CDATA[<p>Welches Verhalten erwartest du denn von deinem Code?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/982549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/982549</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 31 Jan 2006 20:53:02 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherbereinung via delete on Tue, 31 Jan 2006 21:11:09 GMT]]></title><description><![CDATA[<p>..., dass es beim zweiten machWas in einem Segmentation Fault beendet wird, um sicher zu gehen, dass die Variable obj und damit einhergehend der Speicher der Attribute des Objekts und des Objekts an sich leer ist.</p>
<p>Wichtig für mich wäre eben, dass main() unberührt von &quot;obj = NULL&quot; und ähnlichem bliebe, deshalb auch die Auslagerung in Funktionen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/982562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/982562</guid><dc:creator><![CDATA[Stefan_Guest]]></dc:creator><pubDate>Tue, 31 Jan 2006 21:11:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherbereinung via delete on Tue, 31 Jan 2006 21:23:15 GMT]]></title><description><![CDATA[<p>Offenbar übergibt die Speicherverwaltung aus Effizienzgründen den Speicher nicht sofort wieder an das System zurück <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="😉"
    /> will heissen wenn Du später neue Objekte erzeugst und _dann_ wieder auf den &quot;toten&quot; Pointer zugreifst dürften unschöne Dinge passieren...</p>
<p>Merke: Das Verhalten beim Zugriff auf nicht-allokierten Speicher ist _undefiniert_, d.h. es gibt nicht zwangsläufig irgendeinen Fehler, sondern es passiert wahrhaft _irgendwas_!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/982571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/982571</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 31 Jan 2006 21:23:15 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Speicherbereinung via delete on Tue, 31 Jan 2006 22:17:41 GMT]]></title><description><![CDATA[<p>Stefan_Guest schrieb:</p>
<blockquote>
<p>..., dass es beim zweiten machWas in einem Segmentation Fault beendet wird, um sicher zu gehen, dass die Variable obj und damit einhergehend der Speicher der Attribute des Objekts und des Objekts an sich leer ist.</p>
<p>Wichtig für mich wäre eben, dass main() unberührt von &quot;obj = NULL&quot; und ähnlichem bliebe, deshalb auch die Auslagerung in Funktionen.</p>
</blockquote>
<p>Da du nur eine Kopie des Zeiger änderst, musst die eine Reference oder einen Zeiger auf den Zeiger an die Funktion übergeben. Das sähe dann ungefähr so aus:</p>
<pre><code class="language-cpp">int delete_obj(Object *&amp;obj) {
    delete obj;
    obj = NULL;
    return 0;
}
</code></pre>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/982604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/982604</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Tue, 31 Jan 2006 22:17:41 GMT</pubDate></item></channel></rss>