<?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[multidim stl vector memory leak]]></title><description><![CDATA[<p>Hi Leute ich erhalte ein Memoryleak wenn ich folgende funktion in einer Schleife nutze:</p>
<pre><code class="language-cpp">vector&lt;vector&lt;vector&lt;string&gt;&gt;&gt;vcat;
for (int x=0; x&lt;1000; x++)
{
  vector&lt;vector&lt;string&gt;&gt;twodim;
  vector&lt;string&gt;onedim;
  vcat.push_back(twodim);
  vcat[x].push_back(onedim);
  vcat[x][0].push_back(&quot;test&quot;);
}
</code></pre>
<p>Kann mir einer sagen warum?<br />
Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/264554/multidim-stl-vector-memory-leak</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 16:50:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264554.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Apr 2010 09:36:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 09:36:01 GMT]]></title><description><![CDATA[<p>Hi Leute ich erhalte ein Memoryleak wenn ich folgende funktion in einer Schleife nutze:</p>
<pre><code class="language-cpp">vector&lt;vector&lt;vector&lt;string&gt;&gt;&gt;vcat;
for (int x=0; x&lt;1000; x++)
{
  vector&lt;vector&lt;string&gt;&gt;twodim;
  vector&lt;string&gt;onedim;
  vcat.push_back(twodim);
  vcat[x].push_back(onedim);
  vcat[x][0].push_back(&quot;test&quot;);
}
</code></pre>
<p>Kann mir einer sagen warum?<br />
Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879889</guid><dc:creator><![CDATA[fragesteller1]]></dc:creator><pubDate>Fri, 09 Apr 2010 09:36:01 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 09:42:49 GMT]]></title><description><![CDATA[<p>1. Ich sehe keine Funktion.<br />
2. Was soll das eigentlich werden?<br />
3. Warum deklarierst du innerhalb einer Schleife?</p>
<p>EDIT:<br />
Memory Leak gibt's bei mir auch nicht. Würde dafür auch keinen Grund geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879892</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Fri, 09 Apr 2010 09:42:49 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 09:40:15 GMT]]></title><description><![CDATA[<p>Ich nicht.<br />
Dafür bekomme ich Compiler fehler.<br />
Das zusammenschreiben von &gt; Klammern bei Templates ist erst mit dem neuen Standard erlaubt.</p>
<ol>
<li>Gib uns den Code den du wirklich benutzt</li>
<li>Etwas mehr Informationen bitte, wie kommst du drauf das hier ein Memory Leak verursacht wird?</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1879893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879893</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Fri, 09 Apr 2010 09:40:15 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 09:53:25 GMT]]></title><description><![CDATA[<p>auch wenn ich die elemente lösche bleibt der speicherbedarf hoch:</p>
<pre><code class="language-cpp">for (int a=0; a&lt;vcat.size()-1; a++)
			{
				for (int b=0; b&lt;vcat[a].size()-1; a++)
				{
					for (int c=0; c&lt;vcat[a][b].size()-1; c++)
					{
						vcat[a][b][c].erase(vcat[a][b][c].begin(),vcat[a][b][c].end());
					}
					vcat[a][b].erase(vcat[a][b].begin(),vcat[a][b].end());
					cout &lt;&lt; a;
				}
				vcat[a].erase(vcat[a].begin(),vcat[a].end());
			}
			vcat.erase(vcat.begin(),vcat.end());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1879900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879900</guid><dc:creator><![CDATA[fragesteller1]]></dc:creator><pubDate>Fri, 09 Apr 2010 09:53:25 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 09:55:50 GMT]]></title><description><![CDATA[<p>Wozu vcat.erase(vcat.begin(), vcat.end())?<br />
vcat.clear().</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879902</guid><dc:creator><![CDATA[Janjan]]></dc:creator><pubDate>Fri, 09 Apr 2010 09:55:50 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 09:56:34 GMT]]></title><description><![CDATA[<p>fragesteller1 schrieb:</p>
<blockquote>
<p>auch wenn ich die elemente lösche bleibt der speicherbedarf hoch:</p>
</blockquote>
<p>Und was hat der Speicherverbrauch mit einem Speicherloch zu tun? (Fast) nichts. std::vector erzeugt von sich aus keine Speicherlöcher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879903</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 09 Apr 2010 09:56:34 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 09:59:40 GMT]]></title><description><![CDATA[<p>Hoher Speicherverbrauch und Memory Leak sind zwei Paar Schuhe. std::vector is dahingehend optimiert, möglichst wenig Allokationen zu machen. Wenn du Elemente aus einem Vektor löscht wird lediglich der Destruktor für das Element aufgerufen, aber der Speicher wird nicht wieder freigegeben sondern bleibt reserviert für folgende Einfügeoperationen. Der Speicherverbrauch eines Vektors sinkt niemals, es sei denn, man erzwingt es explizit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879906</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Fri, 09 Apr 2010 09:59:40 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 10:04:00 GMT]]></title><description><![CDATA[<p>Viele Implementierungen von std::vector geben den Speicher, den sie einmal angefordert haben nicht frei und daher ist das ganz normal. Wenn du einen std::vector wirklich leeren möchtest, dann mach das so:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; v;
// fülle v
v = std::vector&lt;int&gt; ();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1879910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879910</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 09 Apr 2010 10:04:00 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 10:06:15 GMT]]></title><description><![CDATA[<p>Und selbst wenn man den vector explizit zwingt, den Speicher wieder freizugeben, heißt das noch lange nicht, dass er dadurch anderen Programmen zur Verfügung steht (Kommt auf das Betriebssystem an, das Zurückholen von freiem Speicher vor Prozessende ist aber eher ungewöhnlich). Lediglich andere Teile deines Programms können diesen Speicher dann nutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879913</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 09 Apr 2010 10:06:15 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 10:08:15 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Viele Implementierungen von std::vector geben den Speicher, den sie einmal angefordert haben nicht frei und daher ist das ganz normal. Wenn du einen std::vector wirklich leeren möchtest, dann mach das so:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; v;
// fülle v
v = std::vector&lt;int&gt; ();
</code></pre>
</blockquote>
<p>Das hilft IIRC auch nicht, sondern leert auch nur v. Der behält seinen Speicher trotzdem bein. Wirklich gelöscht wirds durch swap:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; v;
// fülle v
v.swap(std::vector&lt;int&gt;())
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1879915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879915</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 09 Apr 2010 10:08:15 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 10:09:50 GMT]]></title><description><![CDATA[<p>Danke janjan docshoe:<br />
<a href="http://www.codeproject.com/KB/stl/stl_ml.aspx" rel="nofollow">http://www.codeproject.com/KB/stl/stl_ml.aspx</a><br />
überträgt denn der vector nicht einen Zeiger auf den Wert?<br />
Sollte etwa kein clean oder remove durchgeführt werden?<br />
Nunja wenn man die Schleife mit 100 000 Objekte füllt wird schon ziemlich alloziert. Mit clear kommt wird fast alles wieder freigegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879916</guid><dc:creator><![CDATA[fragesteller1]]></dc:creator><pubDate>Fri, 09 Apr 2010 10:09:50 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 10:10:32 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a><br />
Stimmt. Habe ich nicht mehr dran gedacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879918</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 09 Apr 2010 10:10:32 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 10:20:59 GMT]]></title><description><![CDATA[<p>hier noch ein Bsp.</p>
<pre><code class="language-cpp">void foo()
{
	vector&lt;vector&lt;vector&lt;string&gt;&gt;&gt;vcat; 
	for (int x=0; x&lt;100000; x++) 
	{ 
		vector&lt;vector&lt;string&gt;&gt;twodim; 
		vcat.push_back(twodim); 
		for (int y=0; y&lt;5; y++)
		{
			vector&lt;string&gt;onedim; 
			vcat[x].push_back(onedim); 
			vcat[x][y].push_back(&quot;test&quot;); 
		}
	}
	vcat.clear();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1879922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879922</guid><dc:creator><![CDATA[fragesteller1]]></dc:creator><pubDate>Fri, 09 Apr 2010 10:20:59 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 11:14:33 GMT]]></title><description><![CDATA[<p>fragesteller1 schrieb:</p>
<blockquote>
<p>Danke janjan docshoe:<br />
<a href="http://www.codeproject.com/KB/stl/stl_ml.aspx" rel="nofollow">http://www.codeproject.com/KB/stl/stl_ml.aspx</a><br />
überträgt denn der vector nicht einen Zeiger auf den Wert?</p>
</blockquote>
<p>Das ist jetzt das dritte Paar Schuhe...<br />
Im dem Fall, wo lediglich Zeiger auf Objekte in einem Vektor verwaltet werden ruft der Vektor beim Löschen lediglich den Destruktor für Zeiger auf, aber nicht den Destruktor für das Objekt, auf das der Zeiger zeigt. In deinem Fall mag das ja Sinn machen, aber es gibt Fälle, wo man das eben nicht möchte.<br />
boost/TR1 bieten da einige Möglichkeiten, um das automatische Freigeben auch für Zeiger in Containern (smart pointer, pointer container).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879951</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Fri, 09 Apr 2010 11:14:33 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 11:22:20 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Das hilft IIRC auch nicht, sondern leert auch nur v. Der behält seinen Speicher trotzdem bein. Wirklich gelöscht wirds durch swap:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; v;
// fülle v
v.swap(std::vector&lt;int&gt;())
</code></pre>
</blockquote>
<p>Das war mir auch noch nicht bekannt. Gibt vector den allokierten Speicher nicht im Destruktor wieder frei?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879956</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Fri, 09 Apr 2010 11:22:20 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 11:24:28 GMT]]></title><description><![CDATA[<p>Doch, aber in dem Beispiel wird nirgendwo der Destruktor aufgerufen:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; v;
// fülle v
v = std::vector&lt;int&gt; ();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1879959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879959</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Fri, 09 Apr 2010 11:24:28 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 11:29:13 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">v.swap(std::vector&lt;int&gt;())
</code></pre>
<p>Das wird so nicht kompilieren, da RValues nicht an Non-Const-Referenzen gebunden werden. Richtig wäre</p>
<pre><code class="language-cpp">std::vector&lt;int&gt;().swap(v);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1879967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879967</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 09 Apr 2010 11:29:13 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 11:38:11 GMT]]></title><description><![CDATA[<p>DocShoe schrieb:</p>
<blockquote>
<p>Doch, aber in dem Beispiel wird nirgendwo der Destruktor aufgerufen:</p>
</blockquote>
<p>Entweder meinen wir verschiedene Beispiele, aber in dem vom Eröffnungspost werden nur statische Objekte verwendet. Der Destruktor wird am Routinenende also aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879980</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Fri, 09 Apr 2010 11:38:11 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 12:08:55 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Entweder meinen wir verschiedene Beispiele, aber in dem vom Eröffnungspost werden nur statische Objekte verwendet. Der Destruktor wird am Routinenende also aufgerufen.</p>
</blockquote>
<p>Dann verstehe ich die Frage nicht. Bezieht sie sich auf die swap() Technik?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880012</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Fri, 09 Apr 2010 12:08:55 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 12:23:45 GMT]]></title><description><![CDATA[<p>Ich hatte das jetzt so verstanden, dass vector&lt;&gt; generell seinen Speicher nicht freigeben würde. Ich denke mal, dass ich das hier falsch verstanden habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880026</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Fri, 09 Apr 2010 12:23:45 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 12:26:05 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Ich hatte das jetzt so verstanden, dass vector&lt;&gt; generell seinen Speicher nicht freigeben würde. Ich denke mal, dass ich das hier falsch verstanden habe.</p>
</blockquote>
<p>Doch, std::vector gibt sämtlichen allokierten Speicher am Ende seiner Lebenszeit wieder frei. Fallstricke wie Zeiger auf dynamisch erzeugte Objekte, deren Adressen in std::vector verwaltet werden gibt es natürlich, aber solange man &quot;vollständige&quot; Objekte im Vektor ablegt treten keine memory leaks auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880029</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Fri, 09 Apr 2010 12:26:05 GMT</pubDate></item><item><title><![CDATA[Reply to multidim stl vector memory leak on Fri, 09 Apr 2010 14:05:19 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Das hilft IIRC auch nicht, sondern leert auch nur v. Der behält seinen Speicher trotzdem bein. Wirklich gelöscht wirds durch swap:</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; v;
// fülle v
v.swap(std::vector&lt;int&gt;())
</code></pre>
</blockquote>
<p>Das war mir auch noch nicht bekannt. Gibt vector den allokierten Speicher nicht im Destruktor wieder frei?</p>
</blockquote>
<p>Doch, und zwar nur im Destruktor. Im gezeigten Code wird aber nur der temporäre leere vector zerstört, der vector v behält seinen Speicher. Der op= von std::vector arbeitet wohlgemerkt <em>nicht</em> mit copy&amp;swap - das liegt an der &quot;don't pay for what you don't use&quot;-Philosophie von C++, die verbietet, für einen exceptionsicheren op= einen temporären vector von potentiell mehreren MB Größe anzulegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1880097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1880097</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 09 Apr 2010 14:05:19 GMT</pubDate></item></channel></rss>