<?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[delete void*]]></title><description><![CDATA[<p>Ich hab mir ein (älteres) Opensource Program heruntergeladen, und wollte ein paar Bugs fixen.<br />
Unter anderem habe ich festgestellt, dass Memoryleaks auftreten.</p>
<p>Ich hab stark folgenden Code in Verdacht:</p>
<pre><code class="language-cpp">void* AnArray[50];

...
long* Var1 = new long;
AnArray[0] = Var1;
...
CString* Var2 = new CString;
AnArray[1] = Var2;
...

delete AnArray[0];
delete AnArray[1];
... //(die Anzahl der gespeicherten Zeiger ist bekannt)
</code></pre>
<p>Es werden auch noch weitere Typen gespeichert (z.B. BYTE*, DWORD*,...)</p>
<p>Ich bezweifle stark, dass &quot;delete&quot; jeweils die Variablen hier korrekt aufräumt?</p>
<p>Falls er den Speicher nicht korrekt freigibt, kann man da irgendetwas direkt beim &quot;delete&quot; machen (der Code ist zu komplex und zu lang, als dass ich Lust hätte, jede Stelle zu ändern)? Mir schwebte so was wie</p>
<pre><code class="language-cpp">if (dynamic_cast&lt;long*&gt;(AnArray[0]) != NULL)
   delete dynamic_cast&lt;long*&gt;(AnArray[0];
</code></pre>
<p>vor, was ja allerdings nicht funktioniert.</p>
<p>PS: Ich benutzte VS2008, der Code wurde ursprünglich für VS2003 (glaube ich) geschrieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242923/delete-void</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 16:04:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242923.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Jun 2009 19:54:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to delete void* on Tue, 09 Jun 2009 19:54:08 GMT]]></title><description><![CDATA[<p>Ich hab mir ein (älteres) Opensource Program heruntergeladen, und wollte ein paar Bugs fixen.<br />
Unter anderem habe ich festgestellt, dass Memoryleaks auftreten.</p>
<p>Ich hab stark folgenden Code in Verdacht:</p>
<pre><code class="language-cpp">void* AnArray[50];

...
long* Var1 = new long;
AnArray[0] = Var1;
...
CString* Var2 = new CString;
AnArray[1] = Var2;
...

delete AnArray[0];
delete AnArray[1];
... //(die Anzahl der gespeicherten Zeiger ist bekannt)
</code></pre>
<p>Es werden auch noch weitere Typen gespeichert (z.B. BYTE*, DWORD*,...)</p>
<p>Ich bezweifle stark, dass &quot;delete&quot; jeweils die Variablen hier korrekt aufräumt?</p>
<p>Falls er den Speicher nicht korrekt freigibt, kann man da irgendetwas direkt beim &quot;delete&quot; machen (der Code ist zu komplex und zu lang, als dass ich Lust hätte, jede Stelle zu ändern)? Mir schwebte so was wie</p>
<pre><code class="language-cpp">if (dynamic_cast&lt;long*&gt;(AnArray[0]) != NULL)
   delete dynamic_cast&lt;long*&gt;(AnArray[0];
</code></pre>
<p>vor, was ja allerdings nicht funktioniert.</p>
<p>PS: Ich benutzte VS2008, der Code wurde ursprünglich für VS2003 (glaube ich) geschrieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724101</guid><dc:creator><![CDATA[Gugi]]></dc:creator><pubDate>Tue, 09 Jun 2009 19:54:08 GMT</pubDate></item><item><title><![CDATA[Reply to delete void* on Tue, 09 Jun 2009 20:27:20 GMT]]></title><description><![CDATA[<p>Warum macht man sowas?</p>
<p>In C++ gibt es viel bessere Varianten als <code>void*</code> . Wenn man unbedingt ein Array aus unterschiedlichen Typen braucht - was an sich schon fragwürdig genug ist - gibt es immer noch typsichere und selbstaufräumende Konstrukte wie <code>boost::any</code> .</p>
<p>Deine <code>delete</code> s räumen wie du denkst <strong>nicht</strong> auf. Genauer gesagt geben sie zwar den Speicher, auf den der Zeiger unmittelbar zeigt, frei. Da der Compiler aber den Typ dahinter nicht kennt, kann er keinen Destruktor aufrufen. Gerade bei Klassen mit dynamischer Speicherverwaltung entsteht dadurch mit grosser Wahrscheinlichkeit ein Memory Leak.</p>
<p>Mit dem aktuellen Design bleibt dir nichts anderes übrig, als jeden Eintrag in den Typen zu casten ( <code>static_cast</code> ), mit dem er erstellt wurde, und anschliessend <code>delete</code> darauf anzuwenden. Zumindest bei den Klassen. Bei den PODs wie <code>int</code> spielt das keine grosse Rolle, da dort sowieso kein Destruktoraufruf stattfindet.</p>
<p>Trotzdem würde ich das Design grundsätzlich nochmals überdenken...</p>
<p><em>Sorry für die vielen Edits, hab immer noch was gefunden, das ich ergänzen könnte... <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="😉"
    /></em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1724114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724114</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 09 Jun 2009 20:27:20 GMT</pubDate></item><item><title><![CDATA[Reply to delete void* on Tue, 09 Jun 2009 23:35:49 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Warum macht man sowas?</p>
<p>In C++ gibt es viel bessere Varianten als <code>void*</code> . Wenn man unbedingt ein Array aus unterschiedlichen Typen braucht - was an sich schon fragwürdig genug ist - gibt es immer noch typsichere und selbstaufräumende Konstrukte wie <code>boost::any</code> .</p>
</blockquote>
<p>Der Code wird wohl so alt sein, das er vor boost::any Zeiten geschrieben worden ist <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/1724213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1724213</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Tue, 09 Jun 2009 23:35:49 GMT</pubDate></item></channel></rss>