<?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[Zu viel Speicherverbrauch]]></title><description><![CDATA[<p>Hey,<br />
ich hoffe ihr könnt mir helfen, ich such schon seit Tagen nach nem fehler in meinem Code. Ich hab einen Binärbaum, von dem ich in einem Array 1024 stück speicher. Ich hab das Gefühl es gibt irgendwo n Memory Leak oderso, weil ich laut Taskmanager etwa 119MB speicher für das Array brauch. Ich hab mal nachgerechnet, eigentlich müssten es &quot;nur&quot; so 24MB sein, da jeder Node des Trees 24byte groß sein müsste, jeder Tree 1022 Nodes haben sollte und es 1024 Trees gibt. Ich muss leider alles speichern, da ich die Daten sonst immer wieder neu erstellen müsste und das kostet Performance, die ich dringend brauche. Ich werd euch mal die Stellen ausem Code zeigen, die das Problem zu sein scheinen.</p>
<pre><code class="language-cpp">//hier wird das Array geüllt, bt = new BinTree[1024] wird natürlich vorher //ausgeführt

for(int x1 = 0; x1 &lt; 32; x1++)
{
     for(int y1 = 0; y1 &lt; 32; y1++)
     {  
         bt[x1*32+y1] = BinTree(x1 * 16,y1 * 16);
     }
}
</code></pre>
<pre><code class="language-cpp">//BinTree Constructor

BinTree::BinTree(int ox, int oy)
{
	int x[3] = {0,32,16};
	int y[3] = {0,0 ,16};
	NodeNull = BTNode(2,2,0,x,y,ox,oy);
	int x2[3] = {0,16,0};
	int y2[3] = {0,16,32};
	NodeOne = BTNode(2,0,2,x2,y2,ox,oy);
}
</code></pre>
<pre><code class="language-cpp">//BTNode constructor alles was nicht vorher deklariert ist kommt aus BTNode

BTNode::BTNode(int nTris, char hyp,int ohyp, int x[3], int y[3],int ox, int oy)
{
	inds = new unsigned int[3];
	Hyp = hyp;

	int i1 = hyp;
	int i2 = (hyp+1)%3;
	inds[hyp] = (x[i1]+ox) * 513 + (y[i1]+oy);
	inds[i2] = (x[i2]+ox) * 513 + (y[i2]+oy);

	int nx = ((x[ohyp]+x[(ohyp+1)%3]) /2);
	int ny = ((y[ohyp]+y[(ohyp+1)%3]) /2);

	int i3 = (hyp+2)%3; 
	inds[i3] = (nx+ox) * 513 + (ny+oy);

	int nx2[3]; 
	int ny2[3]; 

	nx2[i1] = x[i1];
	nx2[i2] = x[i2];
	nx2[i3] = nx;

	ny2[i1] = y[i1];
	ny2[i2] = y[i2];
	ny2[i3] = ny;

	if(nTris &lt; 512)
	{
		Childs = new BTNode[2];
		Childs[0] = BTNode(nTris*2,(hyp+1)%3,hyp,nx2,ny2,ox,oy);
		Childs[1] = BTNode(nTris*2,(hyp+2)%3,hyp,nx2,ny2,ox,oy);
	}
	else
	{
		Childs = NULL;
	}

	isActive = false;
}
</code></pre>
<p>Ich hoffe ihr könnt was entdecken, ich fürchte schon wieder, dass es was ganz blödes ist, woran ich garnicht gedacht hab <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Wenn ihr noch was sehen wollt, sagt bescheid.</p>
<p>m.f.g Luis</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/301265/zu-viel-speicherverbrauch</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 03:37:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301265.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Mar 2012 21:32:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zu viel Speicherverbrauch on Thu, 22 Mar 2012 21:32:50 GMT]]></title><description><![CDATA[<p>Hey,<br />
ich hoffe ihr könnt mir helfen, ich such schon seit Tagen nach nem fehler in meinem Code. Ich hab einen Binärbaum, von dem ich in einem Array 1024 stück speicher. Ich hab das Gefühl es gibt irgendwo n Memory Leak oderso, weil ich laut Taskmanager etwa 119MB speicher für das Array brauch. Ich hab mal nachgerechnet, eigentlich müssten es &quot;nur&quot; so 24MB sein, da jeder Node des Trees 24byte groß sein müsste, jeder Tree 1022 Nodes haben sollte und es 1024 Trees gibt. Ich muss leider alles speichern, da ich die Daten sonst immer wieder neu erstellen müsste und das kostet Performance, die ich dringend brauche. Ich werd euch mal die Stellen ausem Code zeigen, die das Problem zu sein scheinen.</p>
<pre><code class="language-cpp">//hier wird das Array geüllt, bt = new BinTree[1024] wird natürlich vorher //ausgeführt

for(int x1 = 0; x1 &lt; 32; x1++)
{
     for(int y1 = 0; y1 &lt; 32; y1++)
     {  
         bt[x1*32+y1] = BinTree(x1 * 16,y1 * 16);
     }
}
</code></pre>
<pre><code class="language-cpp">//BinTree Constructor

BinTree::BinTree(int ox, int oy)
{
	int x[3] = {0,32,16};
	int y[3] = {0,0 ,16};
	NodeNull = BTNode(2,2,0,x,y,ox,oy);
	int x2[3] = {0,16,0};
	int y2[3] = {0,16,32};
	NodeOne = BTNode(2,0,2,x2,y2,ox,oy);
}
</code></pre>
<pre><code class="language-cpp">//BTNode constructor alles was nicht vorher deklariert ist kommt aus BTNode

BTNode::BTNode(int nTris, char hyp,int ohyp, int x[3], int y[3],int ox, int oy)
{
	inds = new unsigned int[3];
	Hyp = hyp;

	int i1 = hyp;
	int i2 = (hyp+1)%3;
	inds[hyp] = (x[i1]+ox) * 513 + (y[i1]+oy);
	inds[i2] = (x[i2]+ox) * 513 + (y[i2]+oy);

	int nx = ((x[ohyp]+x[(ohyp+1)%3]) /2);
	int ny = ((y[ohyp]+y[(ohyp+1)%3]) /2);

	int i3 = (hyp+2)%3; 
	inds[i3] = (nx+ox) * 513 + (ny+oy);

	int nx2[3]; 
	int ny2[3]; 

	nx2[i1] = x[i1];
	nx2[i2] = x[i2];
	nx2[i3] = nx;

	ny2[i1] = y[i1];
	ny2[i2] = y[i2];
	ny2[i3] = ny;

	if(nTris &lt; 512)
	{
		Childs = new BTNode[2];
		Childs[0] = BTNode(nTris*2,(hyp+1)%3,hyp,nx2,ny2,ox,oy);
		Childs[1] = BTNode(nTris*2,(hyp+2)%3,hyp,nx2,ny2,ox,oy);
	}
	else
	{
		Childs = NULL;
	}

	isActive = false;
}
</code></pre>
<p>Ich hoffe ihr könnt was entdecken, ich fürchte schon wieder, dass es was ganz blödes ist, woran ich garnicht gedacht hab <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Wenn ihr noch was sehen wollt, sagt bescheid.</p>
<p>m.f.g Luis</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2194383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2194383</guid><dc:creator><![CDATA[sulpsulp-c]]></dc:creator><pubDate>Thu, 22 Mar 2012 21:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to Zu viel Speicherverbrauch on Thu, 22 Mar 2012 21:41:46 GMT]]></title><description><![CDATA[<p>ohne jetzt irgendwas genaueres zu sehen, warum benutzt du keine smart pointer? dann hättest du kein problem mit irgendwelchen leaks.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2194387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2194387</guid><dc:creator><![CDATA[vario-500]]></dc:creator><pubDate>Thu, 22 Mar 2012 21:41:46 GMT</pubDate></item><item><title><![CDATA[Reply to Zu viel Speicherverbrauch on Thu, 22 Mar 2012 21:59:51 GMT]]></title><description><![CDATA[<p>wäre cool, zumidnest mal die Strukturen zu kennen...Code ohne Variablendefinition ist jetzt nicht so spannend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2194395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2194395</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Thu, 22 Mar 2012 21:59:51 GMT</pubDate></item><item><title><![CDATA[Reply to Zu viel Speicherverbrauch on Fri, 23 Mar 2012 07:04:46 GMT]]></title><description><![CDATA[<p>Um MemLeaks zu sehen, wäre auch noch der Destruktor interessant. Z. B. hast du ein <strong>inds = new unsigned int[3];</strong> Gibst du das später wieder frei? Und warum machst du da new? Du weißt doch die Anzahl: 3. Und die ist nicht gerade groß, mache dir doch einfach ein <strong>unsigned int inds[3]</strong> als Membervariable, oder gleich ein <strong>std::array&lt;unsigned int,3&gt; inds</strong>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2194457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2194457</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Fri, 23 Mar 2012 07:04:46 GMT</pubDate></item><item><title><![CDATA[Reply to Zu viel Speicherverbrauch on Fri, 23 Mar 2012 07:32:49 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Als Hilfestellung, wenn du ein VC++ benutzt, könntest du folgenden Code am Anfang deiner main-Funktion einfügen, dann gibt der Debugger dir am Ende die nicht freigegebenen Blöcke aus, sowie ein bisschen Inhalt dazu:</p>
<pre><code class="language-cpp">#if defined(_DEBUG)
  _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF); // | _CRTDBG_CHECK_CRT_DF);
#endif
</code></pre>
<p>Danach musst du dann noch versuchen anhand des Inhalts die passenden Stellen zu finden. Ist zwar nicht so einfach, aber man weiß zumindest ob Speicher verloren geht.</p>
<p>Eine Einschränkung ist zu nennen: Wenn der Speicher in einer externen Bibliothek erzeugt wird, und man vergisst diese freizugeben, kann der VC++ dies nicht erkennen.</p>
<p>Mfg Marco</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2194466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2194466</guid><dc:creator><![CDATA[Marc-O]]></dc:creator><pubDate>Fri, 23 Mar 2012 07:32:49 GMT</pubDate></item></channel></rss>