<?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[dynamisches Array löschen, das von einer Funktion erstellt wurde]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe eine Funktion, sagen wir</p>
<pre><code>void getarray(pdata[],int*size){
   pdata=new long[100]; //natürlich nicht immer 100
}
</code></pre>
<p>und die rufe ich jetzt auf</p>
<pre><code>long*pdata;
int size;

getarray(pdata,&amp;size);
</code></pre>
<p>und jetzt meine Frage:</p>
<p>Wie kann ich den Speicher später wieder freigeben? Im Netz habe ich nur delete und delete [] für Arrays gefunden. Beides geht aber nicht, da der delete-Befehl die Größe des Arrays ja nicht kennt.</p>
<pre><code>delete [size] pdata //das wär cool :)
</code></pre>
<p>MfG,<br />
Mircode</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274547/dynamisches-array-löschen-das-von-einer-funktion-erstellt-wurde</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 10:42:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274547.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Sep 2010 09:49:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to dynamisches Array löschen, das von einer Funktion erstellt wurde on Tue, 28 Sep 2010 09:49:43 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe eine Funktion, sagen wir</p>
<pre><code>void getarray(pdata[],int*size){
   pdata=new long[100]; //natürlich nicht immer 100
}
</code></pre>
<p>und die rufe ich jetzt auf</p>
<pre><code>long*pdata;
int size;

getarray(pdata,&amp;size);
</code></pre>
<p>und jetzt meine Frage:</p>
<p>Wie kann ich den Speicher später wieder freigeben? Im Netz habe ich nur delete und delete [] für Arrays gefunden. Beides geht aber nicht, da der delete-Befehl die Größe des Arrays ja nicht kennt.</p>
<pre><code>delete [size] pdata //das wär cool :)
</code></pre>
<p>MfG,<br />
Mircode</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958402</guid><dc:creator><![CDATA[Mircode]]></dc:creator><pubDate>Tue, 28 Sep 2010 09:49:43 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches Array löschen, das von einer Funktion erstellt wurde on Tue, 28 Sep 2010 09:55:17 GMT]]></title><description><![CDATA[<p>Bei delete[] musst (und kannst) du nicht selbst die Größe angeben, die wird intern festgehalten. delete will nur einen Zeiger auf den Speicherbereich, dann klappt das Freigeben auch.</p>
<p>Abgesehen davon ist Reservieren und Freigeben von Speicher auf unterschiedlichen Ebenen imho sehr unschön und verleitet zu Fehlern. Du könntest eine ...Alloc und eine ...Free-Funktion schreiben, oder gleich eine Klasse, die sich (z.B. im Destruktor) um das Aufräumen kümmert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958406</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Tue, 28 Sep 2010 09:55:17 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches Array löschen, das von einer Funktion erstellt wurde on Tue, 28 Sep 2010 10:01:55 GMT]]></title><description><![CDATA[<p>Oder verwende gleich std::vector.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958412</guid><dc:creator><![CDATA[samulaya]]></dc:creator><pubDate>Tue, 28 Sep 2010 10:01:55 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches Array löschen, das von einer Funktion erstellt wurde on Tue, 28 Sep 2010 10:03:16 GMT]]></title><description><![CDATA[<p>So wie die Funktion da steht funktioniert die sowieso nicht da der Arrayzeiger in die Funktion kopiert wird. Du siehst die Änderung außerhalb der Funktion also nicht.<br />
Entweder du übergibst den Zeiger als Referenz oder (besser) du lässt die Funktion den Zeiger einfach zurückgeben.<br />
Ich stimme _matze auch zu. Sowas ist sehr unschön. Warum brauchst du das so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958413</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 28 Sep 2010 10:03:16 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches Array löschen, das von einer Funktion erstellt wurde on Tue, 28 Sep 2010 10:05:42 GMT]]></title><description><![CDATA[<p>Danke für die schnelle Antwort!</p>
<blockquote>
<p>Bei delete[] musst (und kannst) du nicht selbst die Größe angeben, die wird intern festgehalten. delete will nur einen Zeiger auf den Speicherbereich, dann klappt das Freigeben auch.</p>
</blockquote>
<p>Naja, ich kann delete[] pdata; aufrufen, dann stürzt aber alles ab. Ist auch verständlich.</p>
<p>Mein Array hat auch eine akzeptable maximale Größe, ich kann es zur Not auch statisch machen. Aber ich will ja was dazulernen <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>
<blockquote>
<p>Abgesehen davon ist Reservieren und Freigeben von Speicher auf unterschiedlichen Ebenen imho sehr unschön und verleitet zu Fehlern.</p>
</blockquote>
<p>Man muss auch mal was riskieren im Leben.</p>
<blockquote>
<p>Du könntest eine ...Alloc und eine ...Free-Funktion schreiben, oder gleich eine Klasse, die sich (z.B. im Destruktor) um das Aufräumen kümmert.</p>
</blockquote>
<p>Und wie mache ich das? Innerhalb der Free-Funktion bzw. im Destruktor weiß ich doch auch nur indirekt die Größe des Arrays, z.B. weil ich sie in einer Variable mitgebe...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958416</guid><dc:creator><![CDATA[Mircode]]></dc:creator><pubDate>Tue, 28 Sep 2010 10:05:42 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches Array löschen, das von einer Funktion erstellt wurde on Tue, 28 Sep 2010 10:15:39 GMT]]></title><description><![CDATA[<p>Oh Mann ich komm garnicht hinterher so wie es hier Antworten hagelt...</p>
<blockquote>
<p>So wie die Funktion da steht funktioniert die sowieso nicht da der Arrayzeiger in die Funktion kopiert wird.</p>
</blockquote>
<p>War ich wieder zu eilig.</p>
<pre><code>void getarray(long *pdata[],int*size){
   pdata=new long[100]; //natürlich nicht immer 100
   size=100;
}

long*pdata;
int size;

getarray(&amp;pdata,&amp;size);
</code></pre>
<p>Ich hoffe, dass jetzt alles stimmt.</p>
<blockquote>
<p>Ich stimme _matze auch zu. Sowas ist sehr unschön. Warum brauchst du das so?</p>
</blockquote>
<p>Es kann doch oft vorkommen, dass ich eine Funktion haben will, die z.B. ein Bild oder eine Zeichenkette zurückgibt, von der ich die Größe nicht vorher kenne. Wie mache ich das denn schön?</p>
<p>Mir fällt noch ein:</p>
<pre><code>size=getArraySize(bla);
pdata=new long[size];
getArray(pdata);
...
delete [] pdata;
</code></pre>
<p>Aber dann brauche ich 2 Extra-Funktionen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958422</guid><dc:creator><![CDATA[Mircode]]></dc:creator><pubDate>Tue, 28 Sep 2010 10:15:39 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches Array löschen, das von einer Funktion erstellt wurde on Tue, 28 Sep 2010 10:17:06 GMT]]></title><description><![CDATA[<p>Mircode schrieb:</p>
<blockquote>
<blockquote>
<p>Bei delete[] musst (und kannst) du nicht selbst die Größe angeben, die wird intern festgehalten. delete will nur einen Zeiger auf den Speicherbereich, dann klappt das Freigeben auch.</p>
</blockquote>
<p>Naja, ich kann delete[] pdata; aufrufen, dann stürzt aber alles ab. Ist auch verständlich.</p>
</blockquote>
<p>Braunstein hat es schon erklärt. Du übergibst deine Zeiger-Variable, an die Funktion, dies aber by-value! Das heißt, dass die lokale Zeigervariable zwar auf den gleichen Bereich zeigt, wie ihr Ursprung, aber selbst nicht die gleiche Adresse hat. Dementsprechend kannst du mit so einem Konstrukt zwar immer das ändern, worauf der Zeiger zeigt, aber wenn du die Zeigervariable selbst ändern willst, musst du sie per Zeiger auf Zeiger (&quot;**&quot;) oder Referenz (&quot;&amp;&quot;) übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958424</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Tue, 28 Sep 2010 10:17:06 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches Array löschen, das von einer Funktion erstellt wurde on Tue, 28 Sep 2010 10:22:13 GMT]]></title><description><![CDATA[<p>Programmiere C++</p>
<pre><code class="language-cpp">class Image {
   std::vector&lt;int&gt; bits;
// usw
};

Image load() {
   Image img;
   // Daten laden
   return img;
}
</code></pre>
<p>Für Zeichenketten gibt es doch std::string.<br />
Rohe Arrays rumreichen wirst du C++ extrem selten, du solltest das in Klasssen kapseln.</p>
<p>// edit:<br />
Und wer beim Programmieren etwas riskieren will, sollte auf den Mondgeschossen werden <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 />
Wenn eine Herangehensweise Probleme bereiten kann suche ich nach einer besseren Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958426</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 28 Sep 2010 10:22:13 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches Array löschen, das von einer Funktion erstellt wurde on Tue, 28 Sep 2010 11:04:45 GMT]]></title><description><![CDATA[<p>Man könnte auch über Smartpointer nachdenken falls ein vector nicht in Frage kommt (aus welchen Gründen auch immer).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958457</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 28 Sep 2010 11:04:45 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches Array löschen, das von einer Funktion erstellt wurde on Tue, 28 Sep 2010 11:49:37 GMT]]></title><description><![CDATA[<p>Smartpointer würd ich jetzt erstmal nicht empfehlen, solange nicht klar ist, was er machen möchte.</p>
<blockquote>
<p>Es kann doch oft vorkommen, dass ich eine Funktion haben will, die z.B. ein Bild oder eine Zeichenkette zurückgibt, von der ich die Größe nicht vorher kenne.</p>
</blockquote>
<p>Das ist prozedural gedacht. In C++ wirst Du üblicherweise ein Bild in einer Klasse kapseln, sprich: Nein, so etwas sollte eigentlich nicht vorkommen. <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>Angenommen, Du nutzt irgendeine Grafikbibliothek, um Bilder zu laden. Sehr häufig wird dir das natürlich nur Rohdaten, d.h. einen Zeiger auf Speicher zurückliefern. Dann wirst Du diesen Speicher aber eben in einer Klasse kapseln und gut ist.</p>
<p>Ich empfehle Dir ein Buch. C++ Primer oder so, das wird hier immer gern empfohlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958479</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Tue, 28 Sep 2010 11:49:37 GMT</pubDate></item></channel></rss>