<?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 deallocieren bei dynamischen dreidimensionalem Array]]></title><description><![CDATA[<p>Hallo erstmal. Ich habe heute ein programm geschrieben welches dynamisch ein<br />
dreidimensionales Array anlegt , etwas damit macht , das Ergebniss in Tabellenform ausgibt und danach den reservierten Speicher wieder freigeben soll.<br />
Habe ich alles gemacht - so weit , so gut...</p>
<p>Meine Freage bezieht sich auf das de-allocieren des Speichers. Mir fällt leider keine Möglichkeit ein zu prüfen ob der Speicher wirklich freigegeben wurde wenn das Programm beendet wird. Es geht ja auch ohne. Ich poste hier also mal die wichtigen Teile des Codes :</p>
<p>Hier lege ich das dynaimsche Array mit 3 Dimensionen an.</p>
<pre><code class="language-cpp">int*** a = new int**[p];          //allocate Memory for the 3 dimensions p,q,r

	for(i=0; i&lt;p;i++)                   
	{	
		a[i] = new int*[q];

		for(j=0;j&lt;q;j++)
		{
			a[i][j]=new int[r];
		}
	}
</code></pre>
<p>Dazwischen fülle ich es mit etwaigen Werten a[i][j][k] auf und gebe das Ganze aus. Jetzt kommt der springende Punkt :</p>
<pre><code class="language-cpp">for(int j=0;j&lt;p;j++)                  //dealocate the memory
	{
		for(int k=0;k&lt;q;k++)
		{
			delete [] a[j][k];
		}
	}
	delete [] a;
</code></pre>
<p>Ist diese Sematik den Code zu löschen Korrekt ? Wie kann ich direkt testen ob der Speicher auch wirklich freigegeben wurde ? Jemand ne Idee ? Ich frage deshalb weil ich den Vorgang zwar für eindimensionale Arrays kenne, aber die Erweiterung auf dreidimensionale Arrays eher auf gut Glück vorgenommen habe.<br />
Danke schonmal im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/236822/speicher-deallocieren-bei-dynamischen-dreidimensionalem-array</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 16:36:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/236822.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 20 Mar 2009 12:49:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicher deallocieren bei dynamischen dreidimensionalem Array on Fri, 20 Mar 2009 12:52:08 GMT]]></title><description><![CDATA[<p>Hallo erstmal. Ich habe heute ein programm geschrieben welches dynamisch ein<br />
dreidimensionales Array anlegt , etwas damit macht , das Ergebniss in Tabellenform ausgibt und danach den reservierten Speicher wieder freigeben soll.<br />
Habe ich alles gemacht - so weit , so gut...</p>
<p>Meine Freage bezieht sich auf das de-allocieren des Speichers. Mir fällt leider keine Möglichkeit ein zu prüfen ob der Speicher wirklich freigegeben wurde wenn das Programm beendet wird. Es geht ja auch ohne. Ich poste hier also mal die wichtigen Teile des Codes :</p>
<p>Hier lege ich das dynaimsche Array mit 3 Dimensionen an.</p>
<pre><code class="language-cpp">int*** a = new int**[p];          //allocate Memory for the 3 dimensions p,q,r

	for(i=0; i&lt;p;i++)                   
	{	
		a[i] = new int*[q];

		for(j=0;j&lt;q;j++)
		{
			a[i][j]=new int[r];
		}
	}
</code></pre>
<p>Dazwischen fülle ich es mit etwaigen Werten a[i][j][k] auf und gebe das Ganze aus. Jetzt kommt der springende Punkt :</p>
<pre><code class="language-cpp">for(int j=0;j&lt;p;j++)                  //dealocate the memory
	{
		for(int k=0;k&lt;q;k++)
		{
			delete [] a[j][k];
		}
	}
	delete [] a;
</code></pre>
<p>Ist diese Sematik den Code zu löschen Korrekt ? Wie kann ich direkt testen ob der Speicher auch wirklich freigegeben wurde ? Jemand ne Idee ? Ich frage deshalb weil ich den Vorgang zwar für eindimensionale Arrays kenne, aber die Erweiterung auf dreidimensionale Arrays eher auf gut Glück vorgenommen habe.<br />
Danke schonmal im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683349</guid><dc:creator><![CDATA[Rachanol]]></dc:creator><pubDate>Fri, 20 Mar 2009 12:52:08 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher deallocieren bei dynamischen dreidimensionalem Array on Fri, 20 Mar 2009 12:52:26 GMT]]></title><description><![CDATA[<p>reicht hier nicht <code>delete [] a;</code> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683353</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 20 Mar 2009 12:52:26 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher deallocieren bei dynamischen dreidimensionalem Array on Fri, 20 Mar 2009 12:55:49 GMT]]></title><description><![CDATA[<p>Für jedes malloc ein free, für jedes new ein delete -&gt; nein, deins reicht nicht aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683355</guid><dc:creator><![CDATA[feigling]]></dc:creator><pubDate>Fri, 20 Mar 2009 12:55:49 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher deallocieren bei dynamischen dreidimensionalem Array on Fri, 20 Mar 2009 12:57:34 GMT]]></title><description><![CDATA[<p>daersc schrieb:</p>
<blockquote>
<p>reicht hier nicht <code>delete [] a;</code> ?</p>
</blockquote>
<p>Nein.</p>
<p>Du musst jede deiner logischen Dimension einzeln freigeben, also <code>a[j][k]</code> , <code>a[j]</code> und ganz am Schluss auch <code>a</code> selbst. Wesentlich einfacher wäre es, die Dimensionslogik selbst zu programmieren, mittels Operatorüberladung kannst du dir diese Allokationen grösstenteils sparen. Sind das zufällig Übungsaufgaben zu einer Vorlesung? <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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683356</guid><dc:creator><![CDATA[*rant*]]></dc:creator><pubDate>Fri, 20 Mar 2009 12:57:34 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher deallocieren bei dynamischen dreidimensionalem Array on Fri, 20 Mar 2009 13:22:10 GMT]]></title><description><![CDATA[<p>Du kannst dir überlegen, wie du den Speicher anforderst. Zuerst das äusserste Array. Dann für jedes Element wiederum ein Array, und so weiter. Jetzt schaust du, dass du innen mit löschen beginnst und in umgekehrter Reihenfolge wieder freigibst.</p>
<p>Da es noch niemand erwähnt hat, kann ich ja mal die STL-Container erwähnen, damit spart man sich manuelle Speicherverwaltung und hat gerade noch einige praktische Operationen zur Verfügung. <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>Rachanol schrieb:</p>
<blockquote>
<p>Wie kann ich direkt testen ob der Speicher auch wirklich freigegeben wurde ? Jemand ne Idee ?</p>
</blockquote>
<p>Eben, versuch die Vorgehensweise nachvollziehen. Du kannst auch ruhig ein Blatt Papier nehmen und dir die Speicheranforderung grafisch darstellen. Aber manuelle Speicherverwaltung solltest du verstanden haben, das ist ein wichtiges Thema von C++, auch wenn man in der Praxis nicht sehr oft damit konfrontiert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683374</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 20 Mar 2009 13:22:10 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher deallocieren bei dynamischen dreidimensionalem Array on Fri, 20 Mar 2009 14:42:09 GMT]]></title><description><![CDATA[<p>Danke für die Hilfe.</p>
<p>Ich habe beim Aufbau also ein Array P mit der Dimension p.<br />
Dann p Arrays Q mit der Dimension q.<br />
Schlussendlich noch p mal q Arrays R mit der Dimansion r. -&gt; &quot;3D Würfel&quot; aus zusammengesetzten kleinen Arrayelementquadern^^.</p>
<p>Zuerst lösche ich also wieder die dritte gesamte Dimension r (delete[j][k]) , dann q (delete[k]) und am Schluss nochmal das einzelne array mit dim p per<br />
delete [] a. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683451</guid><dc:creator><![CDATA[Rachanol]]></dc:creator><pubDate>Fri, 20 Mar 2009 14:42:09 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher deallocieren bei dynamischen dreidimensionalem Array on Fri, 20 Mar 2009 14:48:57 GMT]]></title><description><![CDATA[<p>Was spricht eigtl ggn:</p>
<pre><code class="language-cpp">int *a = new int[p*q*r];
//früher a[x][y][z], jetzt:
a[z + y*r + x*p*q]; //bin mir gerad nicht mehr ganz sicher, aber sollte nicht das problem sein, mal paar sekunden nachzudenken und zu probieren ^^
delete []a;
</code></pre>
<p>auf jeden fall würd ich das ganze in ne klasse kapseln, sonst hat man halt das prob, dass man bei den deletes nich mehr durchsieht - außerdem hat man so das prob (vorteil - je nach dem), dass man den speicher nicht am stück hat...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683456</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 20 Mar 2009 14:48:57 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher deallocieren bei dynamischen dreidimensionalem Array on Fri, 20 Mar 2009 15:03:54 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>Was spricht eigtl ggn:</p>
<pre><code class="language-cpp">int *a = new int[p*q*r];
//früher a[x][y][z], jetzt:
a[z + y*r + x*p*q]; //bin mir gerad nicht mehr ganz sicher, aber sollte nicht das problem sein, mal paar sekunden nachzudenken und zu probieren ^^
delete []a;
</code></pre>
<p>auf jeden fall würd ich das ganze in ne klasse kapseln, sonst hat man halt das prob, dass man bei den deletes nich mehr durchsieht - außerdem hat man so das prob (vorteil - je nach dem), dass man den speicher nicht am stück hat...</p>
<p>bb</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683467</guid><dc:creator><![CDATA[*rant*]]></dc:creator><pubDate>Fri, 20 Mar 2009 15:03:54 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher deallocieren bei dynamischen dreidimensionalem Array on Fri, 20 Mar 2009 21:52:57 GMT]]></title><description><![CDATA[<p>Danke ! jetzt hats geklappt :<br />
So hab ichs gemacht :</p>
<pre><code class="language-cpp">for(int i=0;j&lt;p,j++)
{
    for(int k=0;k&lt;q;k++)
    {
        delete [] a[j][k];
    }
    delete [] a[j];
}
delete [] a;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1683658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683658</guid><dc:creator><![CDATA[Rachanol]]></dc:creator><pubDate>Fri, 20 Mar 2009 21:52:57 GMT</pubDate></item><item><title><![CDATA[Reply to Speicher deallocieren bei dynamischen dreidimensionalem Array on Sat, 21 Mar 2009 14:15:54 GMT]]></title><description><![CDATA[<p>Rachanol schrieb:</p>
<blockquote>
<p>Danke ! jetzt hats geklappt :<br />
So hab ichs gemacht :</p>
<pre><code class="language-cpp">for(int i=0;j&lt;p,j++)
{
    for(int k=0;k&lt;q;k++)
    {
        delete [] a[j][k];
    }
    delete [] a[j];
}
delete [] a;
</code></pre>
</blockquote>
<p>hättest dir auch ma meinen post durchlesen können <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
du kannst allein mal deine news+delete`s zählen und wirst merken, dass es doch ne ganze menge ist - im vrgl zu einem einzigen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
und dann kannst du dir mal über die exception-sicherheit deines codes gedanken machen (jedes new kann fehlschlagen und du musst dann bereits bewilligten speicherplatz wieder freigeben).<br />
du könntest natürlich auch mal sagen, für was genau du das array brauchst (iwas mit tabelle und ausgeben - aber bissl genauer wär scho toll ^^)...<br />
ich vermute nämlich mal, dass es auch nen stl-container tut <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
auf jeden fall geht es mit sicherheit besser/eleganter/sicherer und vmrtl. auch schneller...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683793</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 21 Mar 2009 14:15:54 GMT</pubDate></item></channel></rss>