<?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[Zeiger Frage]]></title><description><![CDATA[<p>Warum ist das illegal? (Wird so in den Lösungen einer Aufgabe genannt)</p>
<pre><code class="language-cpp">vector&lt;string&gt; *pvec1 = new vector&lt;string&gt;(10);
vector&lt;string&gt; *pv2 = pvec1;
delete pv2;
</code></pre>
<p>Darf ich nur über &quot;pvec1&quot; Speicher löschen, und nicht indirekt über pv2?</p>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/234946/zeiger-frage</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 07:37:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/234946.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 24 Feb 2009 00:07:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger Frage on Tue, 24 Feb 2009 00:07:33 GMT]]></title><description><![CDATA[<p>Warum ist das illegal? (Wird so in den Lösungen einer Aufgabe genannt)</p>
<pre><code class="language-cpp">vector&lt;string&gt; *pvec1 = new vector&lt;string&gt;(10);
vector&lt;string&gt; *pv2 = pvec1;
delete pv2;
</code></pre>
<p>Darf ich nur über &quot;pvec1&quot; Speicher löschen, und nicht indirekt über pv2?</p>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1669101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1669101</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Tue, 24 Feb 2009 00:07:33 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Frage on Tue, 24 Feb 2009 00:29:01 GMT]]></title><description><![CDATA[<p>Stromberg schrieb:</p>
<blockquote>
<p>Warum ist das illegal? (Wird so in den Lösungen einer Aufgabe genannt)</p>
<pre><code class="language-cpp">vector&lt;string&gt; *pvec1 = new vector&lt;string&gt;(10);
vector&lt;string&gt; *pv2 = pvec1;
delete pv2;
</code></pre>
<p>Darf ich nur über &quot;pvec1&quot; Speicher löschen, und nicht indirekt über pv2?</p>
<p>MfG<br />
Stromberg</p>
</blockquote>
<p>Es ist nicht illegal, nur gefährlich. Wenn du den Speicher über pv2 löschst, so hast du 2 Zeiger pv2 und pvec1 auf denselben, nicht mehr gültigen Speicher. Das macht zwar noch nichts, aber wenn du nun an anderer Stelle in deinem Programm über pvec1 auf den Speicher zugreifen willst (du kannst ja nicht wissen, dass er gelöscht wurde...), dann hast du ein Problem <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1669104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1669104</guid><dc:creator><![CDATA[*rant*]]></dc:creator><pubDate>Tue, 24 Feb 2009 00:29:01 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Frage on Tue, 24 Feb 2009 00:39:08 GMT]]></title><description><![CDATA[<p>Aber wenn ich mir angewöhne nach dem Löschen ganz schnell &quot;pv2 = NULL&quot; zu verwenden, ist die ganze Situation ja entschärft?</p>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1669105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1669105</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Tue, 24 Feb 2009 00:39:08 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Frage on Tue, 24 Feb 2009 00:42:42 GMT]]></title><description><![CDATA[<p>Stromberg schrieb:</p>
<blockquote>
<p>Aber wenn ich mir angewöhne nach dem Löschen ganz schnell &quot;pv2 = NULL&quot; zu verwenden, ist die ganze Situation ja entschärft?</p>
<p>MfG<br />
Stromberg</p>
</blockquote>
<p>Nein, denn pvec1 bleibt ja bei seinem alten Wert, auch wenn du pv2 auf 0 setzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1669107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1669107</guid><dc:creator><![CDATA[*rant*]]></dc:creator><pubDate>Tue, 24 Feb 2009 00:42:42 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Frage on Tue, 24 Feb 2009 00:54:05 GMT]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>Ich beschäftige mich derzeit auch mit dynamischer Speicherverwaltung.</p>
<p>Wenn ich das richtig sehe, zeigt pvec1 auf die Anfangsadresse des vector.<br />
Dann lässt du pv2 auf pvec1 zeigen.<br />
Die Adresse auf die pv2 zeigt ist also gleich mit der Adresse auf die pvec1 zeigt.<br />
Jetzt löscht du pv2.</p>
<p>pvec1 zeigt aber immer noch auf die Adresse im Speicher.</p>
<p>Ich habe dazu folgenden Text gefunden:</p>
<blockquote>
<p>Freigabe<br />
Der Zeiger muss nicht der sein, mit dem der Speicher angefordert wurde. Er muss lediglich auf den richtigen Speicher zeigen und vom gleichen Typ sein. Nach der Speicherfreigabe durch delete empfiehlt es sich, die Zeigervariable auf 0 zu setzen. Damit wird verhindert, dass an einer anderen Stelle versehentlich eine weitere Freigabe erfolgt. delete erkennt, wenn die Zeigervariable 0 ist, und versucht dann erst gar nicht, dessen Speicher freizugeben. Fast noch wichtiger ist aber, dass eine weitere Verwendung dieses Zeigers zum Auslesen oder Beschreiben des Speichers sofort zu einem Fehler führt und damit auffindbar wird. Nach der Freigabe weist der Zeiger schließlich auf einen Speicherbereich, der nicht mehr gültig ist. Es kann sein, dass der Speicher später wieder vergeben wird. Wird der Zeiger nicht auf 0 gesetzt und arbeitet das Programm wieder mit diesem ungültigen Zeiger, wird Speicher verwendet, der vielleicht von anderen Programmteilen angefordert wurde. Da das Programm aber weiterläuft, als wäre alles in Ordnung, würde dieser Fehler nie gefunden.</p>
</blockquote>
<p>Aja-&gt;Quelle = <a href="http://www.willemer.de/informatik/cpp/dynamic.htm" rel="nofollow">http://www.willemer.de/informatik/cpp/dynamic.htm</a></p>
<p>Im Großen und Ganzen die ausführliche Variante meiner Threadvorgänger <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1669108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1669108</guid><dc:creator><![CDATA[44203215]]></dc:creator><pubDate>Tue, 24 Feb 2009 00:54:05 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Frage on Tue, 24 Feb 2009 17:26:09 GMT]]></title><description><![CDATA[<p>44203215 schrieb:</p>
<blockquote>
<p>Guten Abend,</p>
<p>Ich beschäftige mich derzeit auch mit dynamischer Speicherverwaltung.</p>
<p>Wenn ich das richtig sehe, zeigt pvec1 auf die Anfangsadresse des vector.<br />
Dann lässt du pv2 auf pvec1 zeigen.<br />
Die Adresse auf die pv2 zeigt ist also gleich mit der Adresse auf die pvec1 zeigt.<br />
Jetzt löscht du pv2.</p>
<p>pvec1 zeigt aber immer noch auf die Adresse im Speicher.</p>
</blockquote>
<p>Nicht ganz. pvec1 zeigt in erster Linie auf den vector. Man kann dann noch einen Schritt weitergehen und überlegen, ob ein das auch wohl die Adresse des Anfangs des Speicherbereichs sein könnte. (ist es in dem Fall). Muss aber nicht bei allen Containern so sein.</p>
<p>Das gefährliche mit solchen Konstrukten ist halt, dass du durch übermüdeten Zustand mal irgendwo vergisst ein &quot;= 0&quot; zu machen und schon darfst du diese Unachtsamkeit ein paar Wochen/Jahre später mit einer Debugging Session büssen, weil du einen <a href="http://en.wikipedia.org/wiki/Dangling_pointer" rel="nofollow">wilen Zeiger</a> hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1669513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1669513</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 24 Feb 2009 17:26:09 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Frage on Wed, 25 Feb 2009 13:51:32 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Nicht ganz. pvec1 zeigt in erster Linie auf den vector. Man kann dann noch einen Schritt weitergehen und überlegen, ob ein das auch wohl die Adresse des Anfangs des Speicherbereichs sein könnte. (ist es in dem Fall). Muss aber nicht bei allen Containern so sein.</p>
</blockquote>
<p>Die Adresse des Vektors wird nie die des Speicherbereichs sein.<br />
Der Vektor holt sich den Speicher ja irgendwo dynamisch vom Heap.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1669995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1669995</guid><dc:creator><![CDATA[templäd]]></dc:creator><pubDate>Wed, 25 Feb 2009 13:51:32 GMT</pubDate></item></channel></rss>