<?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[[for_each] Adressen der Elemente behandeln]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen STL Container mit raw-Zeigern:</p>
<pre><code class="language-cpp">std::list&lt;X*&gt; container;
</code></pre>
<p>Und möchte gerne alle Speicherbereiche sicher freigeben, auf die die in &quot;container&quot; gespeicherten Elemente zeigen, ungefähr so:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void SafeDelete(T** ppT) // MSDN
{
	if (*ppT)
	{
		delete *ppT;
		*ppT = NULL;
	}
}

for_each(container.begin(), container.end(), SafeDelete&lt;X&gt;);
</code></pre>
<p>Natürlich meckert der Compiler rum, denn SafeDelete erwartet ja die Adresse des Zeigers (um diesen danach auf NULL setzen zu können).</p>
<p>Kann man mit for_each irgendwie die Adressen der Elemente behandeln?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/293146/for_each-adressen-der-elemente-behandeln</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 13:09:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/293146.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 26 Sep 2011 11:39:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [for_each] Adressen der Elemente behandeln on Mon, 26 Sep 2011 11:39:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen STL Container mit raw-Zeigern:</p>
<pre><code class="language-cpp">std::list&lt;X*&gt; container;
</code></pre>
<p>Und möchte gerne alle Speicherbereiche sicher freigeben, auf die die in &quot;container&quot; gespeicherten Elemente zeigen, ungefähr so:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void SafeDelete(T** ppT) // MSDN
{
	if (*ppT)
	{
		delete *ppT;
		*ppT = NULL;
	}
}

for_each(container.begin(), container.end(), SafeDelete&lt;X&gt;);
</code></pre>
<p>Natürlich meckert der Compiler rum, denn SafeDelete erwartet ja die Adresse des Zeigers (um diesen danach auf NULL setzen zu können).</p>
<p>Kann man mit for_each irgendwie die Adressen der Elemente behandeln?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2123808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2123808</guid><dc:creator><![CDATA[Gast2344]]></dc:creator><pubDate>Mon, 26 Sep 2011 11:39:48 GMT</pubDate></item><item><title><![CDATA[Reply to [for_each] Adressen der Elemente behandeln on Mon, 26 Sep 2011 11:45:32 GMT]]></title><description><![CDATA[<p>Benötigst du wirklich raw pointer in deiner Collection? Ist nicht ein Smart pointer besser geeignet?</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2123811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2123811</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Mon, 26 Sep 2011 11:45:32 GMT</pubDate></item><item><title><![CDATA[Reply to [for_each] Adressen der Elemente behandeln on Mon, 26 Sep 2011 11:50:08 GMT]]></title><description><![CDATA[<p>Das <code>SafeDelete()</code> ist für gar nichts. Du musst weder vor dem <code>delete</code> auf <code>NULL</code> prüfen noch nach dem <code>delete</code> auf <code>NULL</code> setzen. <code>delete</code> alleine reicht.</p>
<p>Davon abgesehen sollte die Funktion einen Zeiger als Parameter nehmen, wenn Zeiger gespeichert werden. Aber sinnvoller ist es, gleich entsprechende Container zu verwenden, z.B. Boosts Pointer-Container.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2123814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2123814</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 26 Sep 2011 11:50:08 GMT</pubDate></item><item><title><![CDATA[Reply to [for_each] Adressen der Elemente behandeln on Mon, 26 Sep 2011 12:00:17 GMT]]></title><description><![CDATA[<p>+1 für Boost Pointer Container.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2123817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2123817</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 26 Sep 2011 12:00:17 GMT</pubDate></item><item><title><![CDATA[Reply to [for_each] Adressen der Elemente behandeln on Mon, 26 Sep 2011 12:38:15 GMT]]></title><description><![CDATA[<p>Dieses Safe-Delete Dings sieht man immer wieder. Die Lösung, um dein Ding zum laufen zu bekommen, ist einfach eine Kopie des Zeigers zu nehmen, nicht auf 0 zu prüfen und einfach nur delete zu machen, wie oben schon erwähnt.</p>
<p>Also so:</p>
<pre><code class="language-cpp">void do_delete(T* obj) { delete obj; }
for_each(begin, end, do_delete);
</code></pre>
<p>Besser wäre aber direkt ordentliche Speicherverwaltung. Von Boost ptr-Containern halte ich allerdings Abstand, ptr_map hat z.B. keine intuitive Semantik. Weiters verwenden die Container intern void*, was das Debugging schwerer macht (habe ich zumindest gehört, ich verwende die Dinger ja nicht.)</p>
<p>Ich bevorzuge vector&lt;unique_ptr&lt;T&gt;&gt; bzw vector&lt;shared_ptr&lt;T&gt;&gt;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2123834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2123834</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 26 Sep 2011 12:38:15 GMT</pubDate></item><item><title><![CDATA[Reply to [for_each] Adressen der Elemente behandeln on Mon, 26 Sep 2011 13:04:52 GMT]]></title><description><![CDATA[<p>Naja, man kann sich mit etwas Fantasie schon Zusammenhänge vorstellen, wo man so etwas brauchen könnte. In den meisten dieser Fälle könnte man sich vermutlich sauberere Lösungen vorstellen, aber ich weiß ja nicht, was der TE genau vorhat.</p>
<p>Jedenfalls kann man das ganze mit Referenzen machen:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void SafeDelete(T *&amp;ppT) {
  delete ppT; // delete NULL; macht nichts.
  ppT = NULL;
}

for_each(container.begin(), container.end(), SafeDelete&lt;X&gt;);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2123856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2123856</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 26 Sep 2011 13:04:52 GMT</pubDate></item><item><title><![CDATA[Reply to [for_each] Adressen der Elemente behandeln on Mon, 26 Sep 2011 14:38:56 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Naja, man kann sich mit etwas Fantasie schon Zusammenhänge vorstellen, wo man so etwas brauchen könnte. In den meisten dieser Fälle könnte man sich vermutlich sauberere Lösungen vorstellen, aber ich weiß ja nicht, was der TE genau vorhat.</p>
<p>Jedenfalls kann man das ganze mit Referenzen machen:</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void SafeDelete(T *&amp;ppT) {
  delete ppT; // delete NULL; macht nichts.
  ppT = NULL;
}

for_each(container.begin(), container.end(), SafeDelete&lt;X&gt;);
</code></pre>
</blockquote>
<p>Danke Leute!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2123906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2123906</guid><dc:creator><![CDATA[Gast2344]]></dc:creator><pubDate>Mon, 26 Sep 2011 14:38:56 GMT</pubDate></item><item><title><![CDATA[Reply to [for_each] Adressen der Elemente behandeln on Mon, 26 Sep 2011 14:44:28 GMT]]></title><description><![CDATA[<p>Bist du sicher, dass du die Zeiger nullen musst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2123908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2123908</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 26 Sep 2011 14:44:28 GMT</pubDate></item><item><title><![CDATA[Reply to [for_each] Adressen der Elemente behandeln on Mon, 26 Sep 2011 14:50:02 GMT]]></title><description><![CDATA[<p>Wieso? Sollte das denn schlecht sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2123911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2123911</guid><dc:creator><![CDATA[Gast2344]]></dc:creator><pubDate>Mon, 26 Sep 2011 14:50:02 GMT</pubDate></item><item><title><![CDATA[Reply to [for_each] Adressen der Elemente behandeln on Mon, 26 Sep 2011 14:52:26 GMT]]></title><description><![CDATA[<p>Nein, aber unnötig. Wenn du danach mit den Zeigern nichts mehr machts z.B..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2123913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2123913</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 26 Sep 2011 14:52:26 GMT</pubDate></item><item><title><![CDATA[Reply to [for_each] Adressen der Elemente behandeln on Mon, 26 Sep 2011 14:54:45 GMT]]></title><description><![CDATA[<p>Gast2344 schrieb:</p>
<blockquote>
<p>Wieso? Sollte das denn schlecht sein?</p>
</blockquote>
<p>Du übernimmst Dinge aus anderen Zusammenhängen ohne ihren Zweck zu verstehen. Es ist eine Art Cargo Cult.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2123917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2123917</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 26 Sep 2011 14:54:45 GMT</pubDate></item></channel></rss>