<?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[Memoryleak?]]></title><description><![CDATA[<p>Hi, ich habe folgenden Code in der Hauptschleife platziert:</p>
<pre><code class="language-cpp">for(unsigned int i=0; i&lt;ShotVec.size(); i++)
{
	CShotVec::iterator it = ShotVec.begin();
	it+= i;

	ShotVec.at(i)-&gt;OnDraw();
	ShotVec.at(i)-&gt;OnStep();
	if(ShotVec.at(i)-&gt;GetY()&lt;0)
	{
		delete *it;
		ShotVec.erase(it);
	}
}
</code></pre>
<p>Es geht darum, dass wenn das Objekt den y Wert kleiner als 0 hat, gelöscht wird. Das habe ich mir im Taskmanager beobachtet. Beim erstellen erhöht sich der zugewiesene Speicher um die Größe der Klasse, wird beim zerstören (s.o) aber nicht mehr gesenkt. Tritt hier ein Memoryleak auf?<br />
Das Problem ist auch, dass ich iterator nicht in int konvertieren kann.<br />
Wozu? Naja <a href="http://ShotVec.at" rel="nofollow">ShotVec.at</a>(); arbeitet nunmal mit int aber ich kann leider nicht ShotVec.erase(); mit int benutzen, obwohl das sehr gut wäre, weil ich das direkt aus der for-schleife nehmen könnte.</p>
<p>Vielen Dank schon mal<br />
mfg Critical</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/213840/memoryleak</link><generator>RSS for Node</generator><lastBuildDate>Tue, 13 Oct 2026 21:53:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/213840.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 May 2008 17:12:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Memoryleak? on Thu, 22 May 2008 17:13:41 GMT]]></title><description><![CDATA[<p>Hi, ich habe folgenden Code in der Hauptschleife platziert:</p>
<pre><code class="language-cpp">for(unsigned int i=0; i&lt;ShotVec.size(); i++)
{
	CShotVec::iterator it = ShotVec.begin();
	it+= i;

	ShotVec.at(i)-&gt;OnDraw();
	ShotVec.at(i)-&gt;OnStep();
	if(ShotVec.at(i)-&gt;GetY()&lt;0)
	{
		delete *it;
		ShotVec.erase(it);
	}
}
</code></pre>
<p>Es geht darum, dass wenn das Objekt den y Wert kleiner als 0 hat, gelöscht wird. Das habe ich mir im Taskmanager beobachtet. Beim erstellen erhöht sich der zugewiesene Speicher um die Größe der Klasse, wird beim zerstören (s.o) aber nicht mehr gesenkt. Tritt hier ein Memoryleak auf?<br />
Das Problem ist auch, dass ich iterator nicht in int konvertieren kann.<br />
Wozu? Naja <a href="http://ShotVec.at" rel="nofollow">ShotVec.at</a>(); arbeitet nunmal mit int aber ich kann leider nicht ShotVec.erase(); mit int benutzen, obwohl das sehr gut wäre, weil ich das direkt aus der for-schleife nehmen könnte.</p>
<p>Vielen Dank schon mal<br />
mfg Critical</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514454</guid><dc:creator><![CDATA[Critical]]></dc:creator><pubDate>Thu, 22 May 2008 17:13:41 GMT</pubDate></item><item><title><![CDATA[Reply to Memoryleak? on Thu, 22 May 2008 17:32:42 GMT]]></title><description><![CDATA[<p>Mehr Code wäre gut...</p>
<pre><code class="language-cpp">for(it = ShotVec.begin(); it != ShotVec.end(); ++it) 
{
	it-&gt;OnDraw();
	it-&gt;OnStep();

	if(it-&gt;GetY() &lt; 0) 
		ShotVec.erase(it);
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514477</guid><dc:creator><![CDATA[ceplusplus*loggedoff]]></dc:creator><pubDate>Thu, 22 May 2008 17:32:42 GMT</pubDate></item><item><title><![CDATA[Reply to Memoryleak? on Thu, 22 May 2008 18:00:38 GMT]]></title><description><![CDATA[<p>Critical schrieb:</p>
<blockquote>
<pre><code class="language-cpp">it+= i;
</code></pre>
</blockquote>
<p>Hier gehst du mit dem Iterator immer soviele Stellen vorwärts, wie i gerade ist, nicht immer eine!</p>
<p><em>Edit: Sorry, stimmt natürlich nicht. Ich hab die Initialisierung gerade darüber nicht gesehen. Dennoch könntest du gerade <code>CShotVec::iterator it = ShotVec.begin() + i;</code> schreiben.</em></p>
<p>Aber du kannst es auch einfacher machen, wenn du keine Iteratoren als Zählvariabeln haben willst:</p>
<pre><code class="language-cpp">ShotVec.erase(ShotVec.begin() + i);
</code></pre>
<p>Wobei du aufpassen musst, dass i entsprechend angepasst werden muss, weil ja dann ein Element weniger vorkommt. Sprich:</p>
<pre><code class="language-cpp">i--;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1514480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514480</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 22 May 2008 18:00:38 GMT</pubDate></item><item><title><![CDATA[Reply to Memoryleak? on Thu, 22 May 2008 17:46:43 GMT]]></title><description><![CDATA[<p>So ich habe das jetzt mal überarbeitet:</p>
<pre><code class="language-cpp">for(unsigned int i=0; i&lt;ShotVec.size(); i++)
{
	ShotVec.at(i)-&gt;OnDraw();
	ShotVec.at(i)-&gt;OnStep();

	if(ShotVec.at(i)-&gt;GetY()&lt;0)
	{
		ShotVec.erase(ShotVec.begin() + i);
		i--;
	}
}
</code></pre>
<p>So sollte das richtig sein. Auf jedenfall bleibt der Speicher gleich und geht nicht konsequent in die Höhe. Danke! <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="🙂"
    /><br />
Jetzt noch ne Frage: Wenn ich ShotVec.erase(); aufrufe, wird dann auch die Instanz von CShot zerstört? Also sozusagen ein delete durchgeführt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514484</guid><dc:creator><![CDATA[Critical]]></dc:creator><pubDate>Thu, 22 May 2008 17:46:43 GMT</pubDate></item><item><title><![CDATA[Reply to Memoryleak? on Thu, 22 May 2008 17:57:38 GMT]]></title><description><![CDATA[<p>Das Problem hatte ich auch schon mal.<br />
Wenn im Vektor ein Element gelöscht wird, dann werden die folgenden Elemente alle um eins nach vorne geschoben. Das heisst, es wird einige Male eine Zuweisung (mit <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="🙂"
    /> durchgeführt und jedes Element von dem zu löschenden an wird mit dem nächstfolgenden überschrieben (Mit &quot;löschen&quot; meine ich <code>erase()</code> auf eine Stelle ausführen). Das letzte Element, bzw. die Instanz an der letzten Stelle, wird dann destruiert.<br />
Besonders mühsam wird es, wenn du keine einfache Klasse mehr hast, sondern darin Zeigervariabeln vorkommen. Dann kannst du dich nämlich mit Kopierkonstruktor, überladenem Zuweisungsoperator und Destruktor (die &quot;Grossen Drei&quot;) beschäftigen...</p>
<p>Ach ja, und am Anfang hattest du ein <code>delete</code> geschrieben. Ich denke nicht, dass das bei Iteratoren überhaupt zulässig ist, da diese eigentlich wie Stackvariabeln gehandhabt werden und du sie auch nicht mit <code>new</code> erzeugt hast. Wenn schon, dann müsstest du</p>
<pre><code class="language-cpp">delete it;
</code></pre>
<p>anstelle von</p>
<pre><code class="language-cpp">delete *it;
</code></pre>
<p>schreiben. Wenn du jedoch ein <code>erase()</code> hast, ist das <code>delete</code> sowieso überflüssig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514510</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 22 May 2008 17:57:38 GMT</pubDate></item><item><title><![CDATA[Reply to Memoryleak? on Thu, 22 May 2008 18:02:51 GMT]]></title><description><![CDATA[<p>In dem vector scheinen aber Pointer zu sein. Da ist erstens delete *it; schon richtig und zweitens ein delete auch notwendig, wenn du das nicht irgendwo anders machst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514512</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 22 May 2008 18:02:51 GMT</pubDate></item><item><title><![CDATA[Reply to Memoryleak? on Thu, 22 May 2008 18:21:04 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>In dem vector scheinen aber Pointer zu sein. Da ist erstens delete *it; schon richtig und zweitens ein delete auch notwendig, wenn du das nicht irgendwo anders machst.</p>
</blockquote>
<p>Sorry, ich habe die <strong>-&gt;</strong> nicht weiter beachtet... Ich sollte mal den Code genauer anschauen. <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="😉"
    /></p>
<p>Wenn die Vektorelemente mit <code>new</code> initialisiert wurden, sollte man das <code>delete</code> schon ausführen. Aber was macht dann <code>erase()</code> ? Erkennt es den Pointer und löscht automatisch die Instanz, die man beim Dereferenzieren des Iterators erhält?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1514523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1514523</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 22 May 2008 18:21:04 GMT</pubDate></item></channel></rss>