<?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[Wie vermeide ich memory leaks bei rekursiver Programmierung?]]></title><description><![CDATA[<p>Hallo,<br />
ich habe eine rekursive Funktion mit folgender Struktur geschrieben:</p>
<p>komplexeZahl *FastFourier(int N,komplexeZahl* f)<br />
{ //komplexeZahl ist eine Klasse mit 2 double Werten real und imag</p>
<p>//Rekursionsabbruch<br />
if (N==1)<br />
return f; // F0=f0 f ist nur noch Zeiger auf f0;<br />
...<br />
M=N/2;<br />
komplexeZahl *Coeff;<br />
Coeff=new komplexeZahl[N];</p>
<p>//...neue dynamische Felder aus f erzeugen, namens g und u, die<br />
// M lang sind.(G und U sind auch Felder die M lang sind)<br />
//Rekursionsschritt<br />
G=FastFourier(M,g)<br />
U=FastFourier(M,u)<br />
...//hier wird Coeff mit G und U gefüllt<br />
...<br />
...//den speicher von g,u,G,U kann man hier wieder freigeben<br />
return Coeff;<br />
}</p>
<p>Meine Frage ist nun, wie ich nun den Speicher für die Coeff-Arrays freigeben kann.(unter Beibehaltung der Funktionalität)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/219986/wie-vermeide-ich-memory-leaks-bei-rekursiver-programmierung</link><generator>RSS for Node</generator><lastBuildDate>Thu, 03 Sep 2026 13:30:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219986.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 10 Aug 2008 14:12:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie vermeide ich memory leaks bei rekursiver Programmierung? on Sun, 10 Aug 2008 14:12:50 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe eine rekursive Funktion mit folgender Struktur geschrieben:</p>
<p>komplexeZahl *FastFourier(int N,komplexeZahl* f)<br />
{ //komplexeZahl ist eine Klasse mit 2 double Werten real und imag</p>
<p>//Rekursionsabbruch<br />
if (N==1)<br />
return f; // F0=f0 f ist nur noch Zeiger auf f0;<br />
...<br />
M=N/2;<br />
komplexeZahl *Coeff;<br />
Coeff=new komplexeZahl[N];</p>
<p>//...neue dynamische Felder aus f erzeugen, namens g und u, die<br />
// M lang sind.(G und U sind auch Felder die M lang sind)<br />
//Rekursionsschritt<br />
G=FastFourier(M,g)<br />
U=FastFourier(M,u)<br />
...//hier wird Coeff mit G und U gefüllt<br />
...<br />
...//den speicher von g,u,G,U kann man hier wieder freigeben<br />
return Coeff;<br />
}</p>
<p>Meine Frage ist nun, wie ich nun den Speicher für die Coeff-Arrays freigeben kann.(unter Beibehaltung der Funktionalität)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1562248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1562248</guid><dc:creator><![CDATA[martin l]]></dc:creator><pubDate>Sun, 10 Aug 2008 14:12:50 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich memory leaks bei rekursiver Programmierung? on Sun, 10 Aug 2008 14:16:20 GMT]]></title><description><![CDATA[<p>in dem du cpp-tags verwendest...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1562250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1562250</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 10 Aug 2008 14:16:20 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich memory leaks bei rekursiver Programmierung? on Sun, 10 Aug 2008 14:27:07 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">komplexeZahl *FastFourier(int N,komplexeZahl* f)
{   //komplexeZahl ist eine Klasse mit 2 double Werten real und imag

    //Rekursionsabbruch
    if (N==1)
        return f; // F0=f0 f ist nur noch Zeiger auf f0;
    ...
    M=N/2;
    komplexeZahl *Coeff;
    Coeff=new komplexeZahl[N];

    //...neue dynamische Felder aus f erzeugen, namens g und u, die
    // M lang sind.(G und U sind auch Felder die M lang sind)
    //Rekursionsschritt
    G=FastFourier(M,g)
    U=FastFourier(M,u)
    ...//hier wird Coeff mit G und U gefüllt
    ...
    ...//den speicher von g,u,G,U kann man hier wieder freigeben
    return Coeff;
}
</code></pre>
<p>Sorry war mein erster Post, hatte die Formation nicht gefunden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1562255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1562255</guid><dc:creator><![CDATA[martin l]]></dc:creator><pubDate>Sun, 10 Aug 2008 14:27:07 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich memory leaks bei rekursiver Programmierung? on Sun, 10 Aug 2008 14:34:27 GMT]]></title><description><![CDATA[<p>Du kannst den Speicher einfach vor dem return wieder freigeben.</p>
<p>Wenn du an das Ende einer Funktion gelangst, ob sie jetzt rekursiv ist, oder nicht, kannst du den Speicher wieder freigeben, weil du da sicher nicht mehr darauf zugreifst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1562257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1562257</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 10 Aug 2008 14:34:27 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich memory leaks bei rekursiver Programmierung? on Sun, 10 Aug 2008 14:35:47 GMT]]></title><description><![CDATA[<p>Am leichtesten geht das so</p>
<pre><code class="language-cpp">boost::shared_array&lt;komplexeZahl&gt;
FastFourier (int const N, komplexeZahl const&amp; f) {
    // beim Rest brauchst Du keine Hilfe - oder?

    boost::shared_array&lt;komplexeZahl&gt; r (new komplexeZahl[N]);

    return r;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1562258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1562258</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Sun, 10 Aug 2008 14:35:47 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich memory leaks bei rekursiver Programmierung? on Sun, 10 Aug 2008 14:39:10 GMT]]></title><description><![CDATA[<p>Das Problem ist dann aber, dass ich die dynamische Variable lösche, die ich mit return zurückgeben möchte.<br />
also sowas:</p>
<pre><code class="language-cpp">delete[] Coeff;
return Coeff;
</code></pre>
<p>geht doch dann nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1562260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1562260</guid><dc:creator><![CDATA[martin l]]></dc:creator><pubDate>Sun, 10 Aug 2008 14:39:10 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich memory leaks bei rekursiver Programmierung? on Sun, 10 Aug 2008 14:39:37 GMT]]></title><description><![CDATA[<p>Du müsstest den Speicher, den du hier</p>
<pre><code class="language-cpp">Coeff=new komplexeZahl[N];
</code></pre>
<p>angefordert hast, wieder freigeben. Ich bin mir jetzt nicht sicher, was U und G bei dir sind (du hast geschrieben auch Felder), aber bevor du sie per Zuweisungsoperator überschreibst, solltest du sie löschen (wenn ihre Elemente auch Zeiger sind, diese auch freigeben).</p>
<pre><code class="language-cpp">delete[] G;
G=FastFourier(M,g)
delete[] U;
U=FastFourier(M,u)
</code></pre>
<p>Aber du musst auch schauen, dass du den zurückgegebenen Wert auch immer schön löschst (nach der Rückgabe, wenn er nicht mehr benötigt wird). Ich würd dir sowieso zu <code>std::vector</code> oder anderen Containern raten.</p>
<p>drakon schrieb:</p>
<blockquote>
<p>Du kannst den Speicher einfach vor dem return wieder freigeben.</p>
</blockquote>
<p>Nein, kann er nicht, er gibt ja den auf dem Heap angelegten Zeiger <code>Coeff</code> zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1562261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1562261</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 10 Aug 2008 14:39:37 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich memory leaks bei rekursiver Programmierung? on Sun, 10 Aug 2008 14:43:08 GMT]]></title><description><![CDATA[<p>Kann mir nicht vorstellen, dass man das nicht einfacher Designen kann. Braucht man für Fast Fourier wirklich ständig nene Speicher? Wäre dann ja nicht sehr fast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1562262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1562262</guid><dc:creator><![CDATA[DieFetteElke]]></dc:creator><pubDate>Sun, 10 Aug 2008 14:43:08 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich memory leaks bei rekursiver Programmierung? on Sun, 10 Aug 2008 14:56:31 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Du kannst den Speicher einfach vor dem return wieder freigeben.</p>
</blockquote>
<p>Nein, kann er nicht, er gibt ja den auf dem Heap angelegten Zeiger <code>Coeff</code> zurück.</p>
</blockquote>
<p>Jop. Stimmt, habe ich übersehen. Würde daher auch eher zu einem std::vector raten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1562269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1562269</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 10 Aug 2008 14:56:31 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich memory leaks bei rekursiver Programmierung? on Sun, 10 Aug 2008 17:18:53 GMT]]></title><description><![CDATA[<p>Vielen Dank, für eure Antworten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1562318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1562318</guid><dc:creator><![CDATA[martin l]]></dc:creator><pubDate>Sun, 10 Aug 2008 17:18:53 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich memory leaks bei rekursiver Programmierung? on Mon, 11 Aug 2008 07:39:30 GMT]]></title><description><![CDATA[<p>martin l schrieb:</p>
<blockquote>
<p>Das Problem ist dann aber, dass ich die dynamische Variable lösche, die ich mit return zurückgeben möchte.</p>
</blockquote>
<p>Deshalb sollst Du auch ein Shared Array verwenden, oder Du entwirfst die Funktion grundsätzlich anders.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1562477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1562477</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Mon, 11 Aug 2008 07:39:30 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich memory leaks bei rekursiver Programmierung? on Mon, 11 Aug 2008 08:49:58 GMT]]></title><description><![CDATA[<p>~john schrieb:</p>
<blockquote>
<p>oder Du entwirfst die Funktion grundsätzlich anders.</p>
</blockquote>
<p>Das wäre auf jeden Fall bedenkenswert. Funktionsimplementationen, die mal dort allokierten Speicher zurückgeben oder auch mal nicht, sind grundsätzlich zu hinterfragen.<br />
In diesem speziellen Fall fällt z.B. auf, dass die Zahl der insgesamt benötigten Zahlen bereits vor der ersten Rekursion feststeht. Man könnte also den gesamten benötigten Speicher im voraus allokieren und die Funktionen auf diesem Speicher arbeiten lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1562510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1562510</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 11 Aug 2008 08:49:58 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich memory leaks bei rekursiver Programmierung? on Wed, 05 May 2010 13:42:45 GMT]]></title><description><![CDATA[<p>Ok der Beitrag ist schon ne Weile her.<br />
Ich bin aber gerade wieder über ein ähnliches Problem gestolpert.<br />
Ich denke, wenn man das Feld in eine Klasse packt, dann kann das Feld zurückgegeben werden und beim beenden der Funktion wird dann der Destruktor des Objekts noch aufgerufen.<br />
Dort kann man dann den Speicher nach return wieder freigeben.</p>
<p>Und da die FFT ja eh nur mit Feldgrößen der Potenz von 2 arbeitet, könnte man zur Not auch so 10-15 Funktionen mit festen Arraygrenzen schreiben, was natürlich ziemlich unelegant wäre. Aber die FFT war ja auch nur ein Beispiel für eine typische schnelle Rekursion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1892759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1892759</guid><dc:creator><![CDATA[martin l]]></dc:creator><pubDate>Wed, 05 May 2010 13:42:45 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich memory leaks bei rekursiver Programmierung? on Wed, 05 May 2010 14:02:54 GMT]]></title><description><![CDATA[<p>martin l schrieb:</p>
<blockquote>
<p>Ok der Beitrag ist schon ne Weile her.</p>
</blockquote>
<p>Und sollte daher ruhen. Im Zweifel lieber einen neuen Thread öffnen.</p>
<p>martin l schrieb:</p>
<blockquote>
<p>...<br />
Ich denke, wenn man das Feld in eine Klasse packt, dann kann das Feld zurückgegeben werden und beim beenden der Funktion wird dann der Destruktor des Objekts noch aufgerufen.<br />
Dort kann man dann den Speicher nach return wieder freigeben.</p>
</blockquote>
<p>Wenn du ein Array in eine Klasse kapselst (nehmen wir für ein Beispiel mal die schon existierende TR1 Klasse std::tr1::array), arbeitest du mit einer Kopie (sofern diese nicht wegoptimiert wird).</p>
<pre><code class="language-cpp">// Ungetestet
template&lt;int N&gt;
std::tr1::array&lt;int, N&gt;
Foo() {
    std::tr1::array&lt;int, N&gt; r;
    // ...
    return r; // Hier wird eine Kopie (sofern keine Compileroptimierung
              // möglich ist) zurückgegeben.
}

int main()
{
    std::tr1::array&lt;int, 3&gt; a = Foo&lt;3&gt;();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1892770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1892770</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 05 May 2010 14:02:54 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich memory leaks bei rekursiver Programmierung? on Wed, 05 May 2010 14:03:17 GMT]]></title><description><![CDATA[<p>~john schrieb:</p>
<blockquote>
<p>Am leichtesten geht das so</p>
<pre><code class="language-cpp">boost::shared_array&lt;komplexeZahl&gt;
FastFourier (int const N, komplexeZahl const&amp; f) {
    // beim Rest brauchst Du keine Hilfe - oder?

    boost::shared_array&lt;komplexeZahl&gt; r (new komplexeZahl[N]);

    return r;
}
</code></pre>
</blockquote>
<p>Schon, aber statt wieder zu boosteln, sollte man das Designproblem lösen, fürchte ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1892771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1892771</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 05 May 2010 14:03:17 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich memory leaks bei rekursiver Programmierung? on Wed, 05 May 2010 14:10:51 GMT]]></title><description><![CDATA[<p>martin l schrieb:</p>
<blockquote>
<p>Aber die FFT war ja auch nur ein Beispiel für eine typische schnelle Rekursion.</p>
</blockquote>
<p>Die typische schnelle Rekursion arbeitet total inplace.</p>
<pre><code class="language-cpp">size_t const unterschwelleFuerRekursion=13;//gerne auch =1
void machwas(Foo* begin,Foo* end){
   size_t anzahl=end-begin;
   if(anzahl&lt;=unterschwelleFuerRekursion){
      machsIterativ(begin,end);//gerne auch machNix(); bei uFR=1
   }
   else{
      Foo* mitte=begin+anzahl/2;
      vorbereitung(begin,mitte,end);
      machwas(begin,mitte);
      machwas(mitte,end);
      nachbereitung(begin,mitte,end);
   }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1892778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1892778</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 05 May 2010 14:10:51 GMT</pubDate></item></channel></rss>