<?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[new und delete von pointern]]></title><description><![CDATA[<p>Hallo Leute, ich weiß nicht ob diese Frage hier oder ins C-Forum gehört. Da es <code>new/delete</code> statt <code>malloc()/free()</code> verwendet versuche ich erst einmal hier.</p>
<p>Ich schaffe es nicht einen Memory Leak loszuwerden. Normalerweise arbeite ich nicht mit manueller Speicherverwaltung, bin jetzt aber durch eine externe Vorgabe dazu gezwungen worden. Mein Problem ist ein Memory Leak (laut Visual Leak Detektor) im <code>ptr_a</code> den ich nicht loswerden kann. Das Programm hat dadurch einen völlig weltfremden fluss und landet bei</p>
<pre><code class="language-cpp">const bool tmp = false;
if( tmp )
{
  // trotz false landet man hier
}
</code></pre>
<p>trotz <code>false</code> innerhalb des <code>if</code> blocks. Scheint so als ob ich irgendwo über den zugelassenen Bereich schreibe..</p>
<p>Wo ich den Fehler &quot;vermute&quot;:<br />
Ich habe die Funktion <code>func_a()</code> die ein Array aus einem Pointer erzeugt, der vom Sichtbarkeitsbereich weder zu <code>func_a()</code> noch zu <code>func_b()</code> gehört.</p>
<pre><code class="language-cpp">float *ptr_a = NULL;
void func_a( ... , &amp;int size_a , float * &amp;ptr_a )
{
 ...
 size_a = // Ergebnis vieler Berechnungen
 ptra = new float[size_a];
}
void func_b( int size_a , float * &amp;ptr_a )
{
  // ... nutze den Pointer A
  delete [] ptr_a;
}
</code></pre>
<p>Dieses Array wird in <code>func_b()</code> gelöscht. Darf ich das, wenn diese wie in den Funktionssignaturen als Referenz übergeben werden oder muss ich es im selben Sichtbarkeitsbereich löschen wo es erzeugt wurde?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/310306/new-und-delete-von-pointern</link><generator>RSS for Node</generator><lastBuildDate>Tue, 04 Aug 2026 19:21:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/310306.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 08 Nov 2012 12:52:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to new und delete von pointern on Thu, 08 Nov 2012 12:52:43 GMT]]></title><description><![CDATA[<p>Hallo Leute, ich weiß nicht ob diese Frage hier oder ins C-Forum gehört. Da es <code>new/delete</code> statt <code>malloc()/free()</code> verwendet versuche ich erst einmal hier.</p>
<p>Ich schaffe es nicht einen Memory Leak loszuwerden. Normalerweise arbeite ich nicht mit manueller Speicherverwaltung, bin jetzt aber durch eine externe Vorgabe dazu gezwungen worden. Mein Problem ist ein Memory Leak (laut Visual Leak Detektor) im <code>ptr_a</code> den ich nicht loswerden kann. Das Programm hat dadurch einen völlig weltfremden fluss und landet bei</p>
<pre><code class="language-cpp">const bool tmp = false;
if( tmp )
{
  // trotz false landet man hier
}
</code></pre>
<p>trotz <code>false</code> innerhalb des <code>if</code> blocks. Scheint so als ob ich irgendwo über den zugelassenen Bereich schreibe..</p>
<p>Wo ich den Fehler &quot;vermute&quot;:<br />
Ich habe die Funktion <code>func_a()</code> die ein Array aus einem Pointer erzeugt, der vom Sichtbarkeitsbereich weder zu <code>func_a()</code> noch zu <code>func_b()</code> gehört.</p>
<pre><code class="language-cpp">float *ptr_a = NULL;
void func_a( ... , &amp;int size_a , float * &amp;ptr_a )
{
 ...
 size_a = // Ergebnis vieler Berechnungen
 ptra = new float[size_a];
}
void func_b( int size_a , float * &amp;ptr_a )
{
  // ... nutze den Pointer A
  delete [] ptr_a;
}
</code></pre>
<p>Dieses Array wird in <code>func_b()</code> gelöscht. Darf ich das, wenn diese wie in den Funktionssignaturen als Referenz übergeben werden oder muss ich es im selben Sichtbarkeitsbereich löschen wo es erzeugt wurde?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268922</guid><dc:creator><![CDATA[asdasdasdasd]]></dc:creator><pubDate>Thu, 08 Nov 2012 12:52:43 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete von pointern on Thu, 08 Nov 2012 13:02:38 GMT]]></title><description><![CDATA[<pre><code>const bool tmp = false; 
if( tmp ) 
{ 
  // trotz false landet man hier 
}
</code></pre>
<p>Wenn ich mich nicht irre, dann dürften das die meisten neueren Compiler wegoptimieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268931</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 08 Nov 2012 13:02:38 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete von pointern on Thu, 08 Nov 2012 13:02:29 GMT]]></title><description><![CDATA[<pre><code>ptra = new float[size_a];
</code></pre>
<p>Wo kommt denn ptra her?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268935</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 08 Nov 2012 13:02:29 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete von pointern on Thu, 08 Nov 2012 13:07:08 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<pre><code>const bool tmp = false; 
if( tmp ) 
{ 
  // trotz false landet man hier 
}
</code></pre>
<p>Wenn ich mich nicht irre, dann dürften das die meisten neueren Compiler wegoptimieren.</p>
</blockquote>
<p>Nicht im Debugmodus. Es nur ein Beispiel, dass es bei einem konstanten bool false im if Block landet, was an sich (mMn) für eine Speicherkorrumpierung spricht.</p>
<p>Sone schrieb:</p>
<blockquote>
<pre><code>float * &amp;ptr_a )
</code></pre>
<p>Willst du das wirklich so haben?</p>
</blockquote>
<p>Sicherlich nicht!</p>
<p>Ich muss einen Pointer aus der höchsten Sichtbarkeitsebene an die Funktionen reichen und sehe im Moment keine andere Lösung.</p>
<p>Der Programmfluss ist so:</p>
<ol>
<li>Pointer wird in außerhalb von <code>func_a()</code> erzeugt</li>
<li>und an <code>func_a()</code> weitergegeben.</li>
<li>Darin wird die benötigte Größe ermittelt, der Speicher reserviert und das Array befüllt.</li>
<li>Danach geht er aus <code>func_a()</code> raus.</li>
<li>Aus dem obersten Sichtbarkeitsbereich wird der nun befüllte Pointer an <code>func_b()</code> weitergegeben.</li>
<li>Darin wird er benutzt und deleted.</li>
</ol>
<p>Wenn ich unmittelbar nach dem <code>delete</code> ein Programmabbruch erzwinge, erhalte ich Memory Leaks. Wenn ich weitermache erhalte ich einen nicht nachvollziehbaren Programmfluss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268937</guid><dc:creator><![CDATA[asdasdasdasd]]></dc:creator><pubDate>Thu, 08 Nov 2012 13:07:08 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete von pointern on Thu, 08 Nov 2012 13:25:38 GMT]]></title><description><![CDATA[<p>asdasdasdasd schrieb:</p>
<blockquote>
<p>Der Programmfluss ist so:</p>
<ol>
<li>Pointer wird in außerhalb von <code>func_a()</code> erzeugt</li>
<li>und an <code>func_a()</code> weitergegeben.</li>
<li>Darin wird die benötigte Größe ermittelt, der Speicher reserviert und das Array befüllt.</li>
<li>Danach geht er aus <code>func_a()</code> raus.</li>
<li>Aus dem obersten Sichtbarkeitsbereich wird der nun befüllte Pointer an <code>func_b()</code> weitergegeben.</li>
<li>Darin wird er benutzt und deleted.</li>
</ol>
<p>Wenn ich unmittelbar nach dem <code>delete</code> ein Programmabbruch erzwinge, erhalte ich Memory Leaks. Wenn ich weitermache erhalte ich einen nicht nachvollziehbaren Programmfluss.</p>
</blockquote>
<p>Da scheint wohl irgendwo der Wurm drin zu sein.<br />
Der Ablauf gibt nicht viel Raum für Memory Leaks, oder &quot;nicht nachvollziehbaren Programmfluss.</p>
<pre><code class="language-cpp">#include &lt;cstddef&gt;
#include &lt;cassert&gt;

void create(float*&amp; p, std::size_t N){
  p = new float[N];
}

void destroy(float*&amp; p, std::size_t){
  delete [] p;
  p=0;
}

int main(){
  float *p = 0;
  create(p, 50);
  assert(p!=0);
  destroy(p,50);
  assert(p==0);
}
</code></pre>
<p>Was sollte da passieren? Ausser bei:<br />
3) ...wird befüllt...<br />
und<br />
6) ...wird benutzt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268943</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Thu, 08 Nov 2012 13:25:38 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete von pointern on Thu, 08 Nov 2012 13:30:24 GMT]]></title><description><![CDATA[<p>Furble Wurble schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Hmm... dann muss ich den Fehler woanders suchen... danke schonmal an alle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268944</guid><dc:creator><![CDATA[asdasdasdasd]]></dc:creator><pubDate>Thu, 08 Nov 2012 13:30:24 GMT</pubDate></item><item><title><![CDATA[Reply to new und delete von pointern on Thu, 08 Nov 2012 13:30:38 GMT]]></title><description><![CDATA[<p>Redesign mit einem modernen C++ Stil!</p>
<p>asdasdasdasd schrieb:</p>
<blockquote>
<p>Ich schaffe es nicht einen Memory Leak loszuwerden.</p>
</blockquote>
<p>Wenn Du C++ modern verwendet, ist die Leckgefahr verschwindend klein.</p>
<p>asdasdasdasd schrieb:</p>
<blockquote>
<p>Normalerweise arbeite ich nicht mit manueller Speicherverwaltung, bin jetzt aber durch eine externe Vorgabe dazu gezwungen worden.</p>
</blockquote>
<p>Manuell Speicher verwalten ist ja auch doof. Dabei macht man nur Fehler. Gib diese Verantwortung möglichst früh an &quot;schlaue Objekte&quot; ab.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">void ungeschickt(char const* filename)
{
  FILE* f = fopen(filename,&quot;r&quot;);
  ...
  fclose(f);
}
</code></pre>
<pre><code class="language-cpp">void schlau(char const* filename)
{
  std::ifstream f (filename);
  ...
}
</code></pre>
<p>Das schlaue daran ist, dass das ifstream-Objekt sich um die Resource kümmern, nicht du selbst. Es gilt also nicht nur um Speicher, sondern für alle möglichen Arten von Resourcen.</p>
<p>Wo kommt denn der Zeiger jetzt eigentlich her? Kannst du das nicht durch einen std::vector ersetzen? Sonst guck mal, ob boost::scoped_array vielleicht etwas für dich ist. Beides sind Beispiele für Klassen, die sich verantwortlich für reservierten Speicher fühlen und ihn automatisch wegräumen, wenn die entsprechenden Instanzen zerstört werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268945</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 08 Nov 2012 13:30:38 GMT</pubDate></item></channel></rss>