<?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[Speicher freigeben bei einem Vector]]></title><description><![CDATA[<p>hi,</p>
<p>ich habe folgendes Problem. Ich habe eine Methode in der ein Vektor angelegt wird</p>
<pre><code class="language-cpp">vector&lt;CMovement*&gt;* movementvec=new vector&lt;CMovement*&gt;
</code></pre>
<p>Diesen fülle ich nun mit Elementen und tausche am Ende seinen Inhalt mit einem anderen Vektor vom gleichen Typ</p>
<pre><code class="language-cpp">m_current_movement-&gt;swap(*movementvec);
</code></pre>
<p>Danach möchte ich nun den Speicher, den movementvec nun belegt wieder freigeben. Ein einfaches clear() und delete auf den Vector reicht dabei ja nicht, da in dem Vektor Pointer gespeichert sind. Ich muss ja also erst die Elemente einzelnt mit einem delete löschen und kann danach ein clear() und ein delete auf den Vektor machen. Dafür habe ich mir folgende Template geschrieben:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
void CGCodeReader::DeleteVectorWithPointers(T* vec){
	for(int i=0; i&lt;vec-&gt;size();i++){
		delete vec-&gt;at(i);
		vec-&gt;at(i)=NULL;
	}
	vec-&gt;clear();
	delete vec;
}
</code></pre>
<p>Diese Funktion scheint auch ordentlich zu funktionieren, jeden Falls wird an allen anderen Stellen in meinem Projekt der Speicher wieder ordentlich frei gegeben. Nur eine Funktion habe ich, bei der ich es einfach nicht schaffe, den vom Vektor belegten Speicher wieder ordentlich freizugeben. Vielleicht hat einer von euch ja eine Idee woran das liegt. Hier die gekürtze Funktion:</p>
<pre><code class="language-cpp">int CGCodeReader::convertToMovements(std::vector&lt;CNcSatz*&gt;* ncliste, bool original)
{
	if(ncliste==NULL &amp;&amp; !original) ncliste = m_current_ncsatzliste;
	else if(ncliste==NULL &amp;&amp; original) ncliste = m_original_ncsatzliste;

	vector&lt;CMovement*&gt;* movementvec=new vector&lt;CMovement*&gt;;
//CAxes *Axes = new CAxes(0,0,0);  //! \todo: define kinematic and create get set functions 

	//remeber the last point we visited (first one ist the startpoint)
	CPoint3 *lastpoint = new CPoint3();
	lastpoint-&gt;SetX(STARTX);
	lastpoint-&gt;SetY(STARTY);
	lastpoint-&gt;SetZ(STARTZ);

	//now walk through all entries (NCSatz)
	vector&lt;CNcSatz*&gt;::iterator iterncsatz;
	iterncsatz=ncliste-&gt;begin();
	int tmp = 0;
	int GCommand = -1;
	while(iterncsatz!=ncliste-&gt;end()){
		GCommand = getCurrentGCommand(*iterncsatz);
		if (GCommand==1 || GCommand==0)
		{
			//we will create a movement from the last point and the next point
			CMovement* movement = new CMovement(linear);

[... (hier wird das movement Objekt mit den richtigen Daten gefüllt)]

		movementvec-&gt;push_back(movement);

		}//if (GCommand==1)

		iterncsatz++;
		tmp++;
	}//while(iterncsatz!=ncliste-&gt;end())

	//delete Axes;
	delete lastpoint;

	if(!original) m_current_movement-&gt;swap(*movementvec);
	else m_original_movement-&gt;swap(*movementvec);

	DeleteVectorWithPointers(movementvec);

	return 1;
}
</code></pre>
<p>Also nach DeleteVectorWithPointers(movementvec) belegt mein Programm immernoch so viel Speicher wie vorher. Pro druchlauf der Funktion erhöht sich der Speicherbrauch bei mir um ca. 20 MB, da die Datensätze die bearbeitet werden sehr groß sind.</p>
<p>Wäre für jede Idee, warum der Speicher nicht ordentlich freigegeben wird dankbar.</p>
<p>Grüße<br />
AnubisTheKing</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/155658/speicher-freigeben-bei-einem-vector</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 12:54:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/155658.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 Aug 2006 12:29:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicher freigeben bei einem Vector on Tue, 08 Aug 2006 12:29:51 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>ich habe folgendes Problem. Ich habe eine Methode in der ein Vektor angelegt wird</p>
<pre><code class="language-cpp">vector&lt;CMovement*&gt;* movementvec=new vector&lt;CMovement*&gt;
</code></pre>
<p>Diesen fülle ich nun mit Elementen und tausche am Ende seinen Inhalt mit einem anderen Vektor vom gleichen Typ</p>
<pre><code class="language-cpp">m_current_movement-&gt;swap(*movementvec);
</code></pre>
<p>Danach möchte ich nun den Speicher, den movementvec nun belegt wieder freigeben. Ein einfaches clear() und delete auf den Vector reicht dabei ja nicht, da in dem Vektor Pointer gespeichert sind. Ich muss ja also erst die Elemente einzelnt mit einem delete löschen und kann danach ein clear() und ein delete auf den Vektor machen. Dafür habe ich mir folgende Template geschrieben:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
void CGCodeReader::DeleteVectorWithPointers(T* vec){
	for(int i=0; i&lt;vec-&gt;size();i++){
		delete vec-&gt;at(i);
		vec-&gt;at(i)=NULL;
	}
	vec-&gt;clear();
	delete vec;
}
</code></pre>
<p>Diese Funktion scheint auch ordentlich zu funktionieren, jeden Falls wird an allen anderen Stellen in meinem Projekt der Speicher wieder ordentlich frei gegeben. Nur eine Funktion habe ich, bei der ich es einfach nicht schaffe, den vom Vektor belegten Speicher wieder ordentlich freizugeben. Vielleicht hat einer von euch ja eine Idee woran das liegt. Hier die gekürtze Funktion:</p>
<pre><code class="language-cpp">int CGCodeReader::convertToMovements(std::vector&lt;CNcSatz*&gt;* ncliste, bool original)
{
	if(ncliste==NULL &amp;&amp; !original) ncliste = m_current_ncsatzliste;
	else if(ncliste==NULL &amp;&amp; original) ncliste = m_original_ncsatzliste;

	vector&lt;CMovement*&gt;* movementvec=new vector&lt;CMovement*&gt;;
//CAxes *Axes = new CAxes(0,0,0);  //! \todo: define kinematic and create get set functions 

	//remeber the last point we visited (first one ist the startpoint)
	CPoint3 *lastpoint = new CPoint3();
	lastpoint-&gt;SetX(STARTX);
	lastpoint-&gt;SetY(STARTY);
	lastpoint-&gt;SetZ(STARTZ);

	//now walk through all entries (NCSatz)
	vector&lt;CNcSatz*&gt;::iterator iterncsatz;
	iterncsatz=ncliste-&gt;begin();
	int tmp = 0;
	int GCommand = -1;
	while(iterncsatz!=ncliste-&gt;end()){
		GCommand = getCurrentGCommand(*iterncsatz);
		if (GCommand==1 || GCommand==0)
		{
			//we will create a movement from the last point and the next point
			CMovement* movement = new CMovement(linear);

[... (hier wird das movement Objekt mit den richtigen Daten gefüllt)]

		movementvec-&gt;push_back(movement);

		}//if (GCommand==1)

		iterncsatz++;
		tmp++;
	}//while(iterncsatz!=ncliste-&gt;end())

	//delete Axes;
	delete lastpoint;

	if(!original) m_current_movement-&gt;swap(*movementvec);
	else m_original_movement-&gt;swap(*movementvec);

	DeleteVectorWithPointers(movementvec);

	return 1;
}
</code></pre>
<p>Also nach DeleteVectorWithPointers(movementvec) belegt mein Programm immernoch so viel Speicher wie vorher. Pro druchlauf der Funktion erhöht sich der Speicherbrauch bei mir um ca. 20 MB, da die Datensätze die bearbeitet werden sehr groß sind.</p>
<p>Wäre für jede Idee, warum der Speicher nicht ordentlich freigegeben wird dankbar.</p>
<p>Grüße<br />
AnubisTheKing</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112925</guid><dc:creator><![CDATA[AnubisTheKing]]></dc:creator><pubDate>Tue, 08 Aug 2006 12:29:51 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben bei einem Vector on Tue, 08 Aug 2006 12:41:10 GMT]]></title><description><![CDATA[<p>Weiss nicht ob das das Problem ist, aber du übergibst der template Funktion keine Parameter?</p>
<pre><code class="language-cpp">DeleteVectorWithPointers(movementvec);
</code></pre>
<pre><code class="language-cpp">DeleteVectorWithPointers&lt; vector&lt; CMovement* &gt; &gt;(movementvec);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1112939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112939</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Tue, 08 Aug 2006 12:41:10 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben bei einem Vector on Tue, 08 Aug 2006 12:51:14 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;typename T&gt;
void CGCodeReader::DeleteVectorWithPointers(T* vec)
{
    for(typename T::iterator i = vec.begin (); i != vec-&gt;end(); ++i)
        delete *i;
    delete vec;
}
</code></pre>
<p>Die sollte es auch tun.</p>
<p>1310-Logik schrieb:</p>
<blockquote>
<p>Weiss nicht ob das das Problem ist, aber du übergibst der template Funktion keine Parameter?</p>
<pre><code class="language-cpp">DeleteVectorWithPointers(movementvec);
</code></pre>
<pre><code class="language-cpp">DeleteVectorWithPointers&lt; vector&lt; CMovement* &gt; &gt;(movementvec);
</code></pre>
</blockquote>
<p>Das bekommt der Compiler schon selbst hin, sonst beschwert er sich.</p>
<p>Springt er auch tatsächlich in die for-Schleife hinein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112953</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Tue, 08 Aug 2006 12:51:14 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben bei einem Vector on Tue, 08 Aug 2006 12:52:24 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">DeleteVectorWithPointers&lt; vector&lt; CMovement* &gt; &gt;(movementvec);
</code></pre>
<p>Habe das gerade mal getestet, ändert leider nichts an meinem Problem. Der Speicher wird einfach nicht frei gegeben.</p>
<p>Mit</p>
<pre><code>&lt; vector&lt; CMovement* &gt; &gt;
</code></pre>
<p>gibst du den Typ für das Template an oder? Muss man das machen oder ist das optional? Kompiliert ja auch ohne die Angabe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112956</guid><dc:creator><![CDATA[AnubisTheKing]]></dc:creator><pubDate>Tue, 08 Aug 2006 12:52:24 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben bei einem Vector on Tue, 08 Aug 2006 12:54:24 GMT]]></title><description><![CDATA[<p>.filmor schrieb:</p>
<blockquote>
<p>Das bekommt der Compiler schon selbst hin, sonst beschwert er sich.</p>
</blockquote>
<p>Sry, wusst ich nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112957</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Tue, 08 Aug 2006 12:54:24 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben bei einem Vector on Tue, 08 Aug 2006 12:55:42 GMT]]></title><description><![CDATA[<p>1310-Logik schrieb:</p>
<blockquote>
<p>.filmor schrieb:</p>
<blockquote>
<p>Das bekommt der Compiler schon selbst hin, sonst beschwert er sich.</p>
</blockquote>
<p>Sry, wusst ich nicht.</p>
</blockquote>
<p>Hast du dich noch nie gefragt, wieso die &lt;algorithm&gt;-Funktionen mit jedem (passenden) Container funktionieren? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1112960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112960</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Tue, 08 Aug 2006 12:55:42 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben bei einem Vector on Tue, 08 Aug 2006 12:58:23 GMT]]></title><description><![CDATA[<p>.filmor schrieb:</p>
<blockquote>
<p>1310-Logik schrieb:</p>
<blockquote>
<p>.filmor schrieb:</p>
<blockquote>
<p>Das bekommt der Compiler schon selbst hin, sonst beschwert er sich.</p>
</blockquote>
<p>Sry, wusst ich nicht.</p>
</blockquote>
<p>Hast du dich noch nie gefragt, wieso die &lt;algorithm&gt;-Funktionen mit jedem (passenden) Container funktionieren? <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>
</blockquote>
<p>Ehrlich gesagt, nein, solange sie funktionieren <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/1112965</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112965</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Tue, 08 Aug 2006 12:58:23 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben bei einem Vector on Tue, 08 Aug 2006 13:16:39 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9606">@.filmor</a></p>
<p>Also der springt in die for-schleife rein. Das delete wird auch ausgeführt und wenn man sich den Speicherinhalt im Debug Modus anschaut, dann sieht man zwar, dass der Inhalt von den CMovement* Objekten gelöscht wird, aber der Speicher nimmt nicht ab.</p>
<p>Gute Idee einen Iterator zum durchlaufen zu benutzen. Werde ich bei mir mal so einbauen. Nur leider ändert das nichts meinem Speicherproblem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112966</guid><dc:creator><![CDATA[AnubisTheKing]]></dc:creator><pubDate>Tue, 08 Aug 2006 13:16:39 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben bei einem Vector on Tue, 08 Aug 2006 13:00:12 GMT]]></title><description><![CDATA[<p>AnubisTheKing schrieb:</p>
<blockquote>
<pre><code class="language-cpp">if(!original) m_current_movement-&gt;swap(*movementvec);
	else m_original_movement-&gt;swap(*movementvec);

	DeleteVectorWithPointers(movementvec);
</code></pre>
</blockquote>
<p>allokierst du m_current_movement bzw. m_original_movement irgendwo, und wenn ja, gibst du die wieder frei?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112968</guid><dc:creator><![CDATA[bumbytie]]></dc:creator><pubDate>Tue, 08 Aug 2006 13:00:12 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher freigeben bei einem Vector on Tue, 08 Aug 2006 13:05:16 GMT]]></title><description><![CDATA[<p>m_current_movement und m_original_movement werden woanders angelegt. Der Speicher von denen wird beim Beenden des Programms im Destruktor über die gleiche Templatefunktion freigegeben. Ansonsten wird m_current_movement und m_original_movement nur in dieser Funktion geändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1112972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1112972</guid><dc:creator><![CDATA[AnubisTheKing]]></dc:creator><pubDate>Tue, 08 Aug 2006 13:05:16 GMT</pubDate></item></channel></rss>