<?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[[erledigt] delete notwendig oder nicht?]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich sitze schon seit Montag an ein und demselben C++-Problem, welches ich kurz schildern möchte.</p>
<p>Situation:<br />
HINWEIS: alles ist stark gekürzt</p>
<ul>
<li>DLL A: erstellt mit Borland C++ Builder 6; wird von Host-Anwendung geladen; unbedingt notwendig wegen hierin realisierter GUI</li>
<li>DLL B: erstellt mit VS 2005 Pro; wird von DLL A nachgeladen; einige Funktionen exportiert</li>
<li>Daten werden über Zeiger auf struct mit Basis-Datentypen zwischen beiden ausgetauscht</li>
<li>struct sieht so aus:</li>
</ul>
<pre><code>[cpp]struct stParameter
      {
          char cParameterName[MAXPARLENGTH];
          float fParameterValue;
          ULONG ulCountCallPath; // Anzahl der Elemente des Parameter-Aufrufpfades
          ULONG *pulCallPath; // Zeiger auf Parameter-Aufrufpfad
          stParameter()
          {
                  memset(&amp;cParameterName[0],   0, sizeof(cParameterName));
                  fParameterValue = 0.0F;
                  ulCountCallPath = 0;
                  [b]pulCallPath = NULL;[/b]
              }
          ~stParameter()
          {
              if (this-&gt;pulCallPath)
              {
                              [b]delete []this-&gt;pulCallPath;[/b]
                              this-&gt;pulCallPath = NULL;
              };
          };
      };[/cpp]
</code></pre>
<ul>
<li>in DLL A wird eine Funktion von DLL B aufgerufen:</li>
</ul>
<pre><code>[cpp]for(i = 0; [...] )
      {
        stParameter *pParList = [b]new[/b] stParameter[iParametersCount];

        int iGDFP = pDA-&gt;dGParFP(pList[i].ulD, pParList, iParametersCount);
        if (iGDFP != -1)
        {
            for (int j = 0; j &lt; iParametersCount; j++)
            {
                 stParameter *Para = [b]new[/b] stParameter(&amp;pParList[j]);

                 ListItem = lvAvailablePar-&gt;Items-&gt;Add();
                 ListItem-&gt;Caption = Para-&gt;cParameterName;
                 // [...]
            }
            else
            {
                 sError = &quot;Fehlermeldungstext&quot;;
            }

            if (pParList)
            {
                 [b]delete []pParList;[/b]
                 pParList = NULL;
            }
        }
       }[/cpp]
</code></pre>
<ul>
<li>der fragliche Teil der aufgerufenen Funktion in DLL B</li>
</ul>
<pre><code>[cpp]Para-&gt;pulCallPath = [b]new[/b] ULONG[Para-&gt;ulCountCallPath];[/cpp]
</code></pre>
<p>Problem:<br />
Alles klappt soweit gut, aber beim Löschen von pParList kommt es dann zum Fehler, wenn im Destruktor der Zeiger gelöscht werden soll. Wenn ich das Löschen auskommentiere, klappt wieder alles.</p>
<p>Fragen:</p>
<ol>
<li>Ist der Destruktor von stParameter so korrekt bzw. wird durch Funktion in DLL B der Zeiger im struct dynamisch?</li>
<li>Wenn ich nicht den Speicher freigebe, entsteht dann ein memory leak?</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/topic/219203/erledigt-delete-notwendig-oder-nicht</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 07:57:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219203.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 Jul 2008 18:12:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [erledigt] delete notwendig oder nicht? on Thu, 31 Jul 2008 14:56:37 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich sitze schon seit Montag an ein und demselben C++-Problem, welches ich kurz schildern möchte.</p>
<p>Situation:<br />
HINWEIS: alles ist stark gekürzt</p>
<ul>
<li>DLL A: erstellt mit Borland C++ Builder 6; wird von Host-Anwendung geladen; unbedingt notwendig wegen hierin realisierter GUI</li>
<li>DLL B: erstellt mit VS 2005 Pro; wird von DLL A nachgeladen; einige Funktionen exportiert</li>
<li>Daten werden über Zeiger auf struct mit Basis-Datentypen zwischen beiden ausgetauscht</li>
<li>struct sieht so aus:</li>
</ul>
<pre><code>[cpp]struct stParameter
      {
          char cParameterName[MAXPARLENGTH];
          float fParameterValue;
          ULONG ulCountCallPath; // Anzahl der Elemente des Parameter-Aufrufpfades
          ULONG *pulCallPath; // Zeiger auf Parameter-Aufrufpfad
          stParameter()
          {
                  memset(&amp;cParameterName[0],   0, sizeof(cParameterName));
                  fParameterValue = 0.0F;
                  ulCountCallPath = 0;
                  [b]pulCallPath = NULL;[/b]
              }
          ~stParameter()
          {
              if (this-&gt;pulCallPath)
              {
                              [b]delete []this-&gt;pulCallPath;[/b]
                              this-&gt;pulCallPath = NULL;
              };
          };
      };[/cpp]
</code></pre>
<ul>
<li>in DLL A wird eine Funktion von DLL B aufgerufen:</li>
</ul>
<pre><code>[cpp]for(i = 0; [...] )
      {
        stParameter *pParList = [b]new[/b] stParameter[iParametersCount];

        int iGDFP = pDA-&gt;dGParFP(pList[i].ulD, pParList, iParametersCount);
        if (iGDFP != -1)
        {
            for (int j = 0; j &lt; iParametersCount; j++)
            {
                 stParameter *Para = [b]new[/b] stParameter(&amp;pParList[j]);

                 ListItem = lvAvailablePar-&gt;Items-&gt;Add();
                 ListItem-&gt;Caption = Para-&gt;cParameterName;
                 // [...]
            }
            else
            {
                 sError = &quot;Fehlermeldungstext&quot;;
            }

            if (pParList)
            {
                 [b]delete []pParList;[/b]
                 pParList = NULL;
            }
        }
       }[/cpp]
</code></pre>
<ul>
<li>der fragliche Teil der aufgerufenen Funktion in DLL B</li>
</ul>
<pre><code>[cpp]Para-&gt;pulCallPath = [b]new[/b] ULONG[Para-&gt;ulCountCallPath];[/cpp]
</code></pre>
<p>Problem:<br />
Alles klappt soweit gut, aber beim Löschen von pParList kommt es dann zum Fehler, wenn im Destruktor der Zeiger gelöscht werden soll. Wenn ich das Löschen auskommentiere, klappt wieder alles.</p>
<p>Fragen:</p>
<ol>
<li>Ist der Destruktor von stParameter so korrekt bzw. wird durch Funktion in DLL B der Zeiger im struct dynamisch?</li>
<li>Wenn ich nicht den Speicher freigebe, entsteht dann ein memory leak?</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1556570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556570</guid><dc:creator><![CDATA[Caprio2L]]></dc:creator><pubDate>Thu, 31 Jul 2008 14:56:37 GMT</pubDate></item><item><title><![CDATA[Reply to [erledigt] delete notwendig oder nicht? on Wed, 30 Jul 2008 18:34:44 GMT]]></title><description><![CDATA[<p>Also erst mal ist der Destruktor so Quatsch. Folgender Code ist äquivalent:</p>
<pre><code class="language-cpp">~stParameter()
{
    delete[] this-&gt;pulCallPath;
}
</code></pre>
<p>Gleiches gilt auch für die andere Stelle, an der Du Speicher per 'delete[]' freigibst. Insbesondere der Test davor ist überflüssig.</p>
<p>Und dann sollte sich immer der Bereitsteller des Speichers um die Freigabe kümmern, oder aber explizit die Besitzherrschaft übertragen. Woher z.B. weiß Deine Klasse, dass ein Array freigegeben werden muss? Der Rest ist ziemlich chaotisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556585</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Wed, 30 Jul 2008 18:34:44 GMT</pubDate></item><item><title><![CDATA[Reply to [erledigt] delete notwendig oder nicht? on Wed, 30 Jul 2008 18:49:32 GMT]]></title><description><![CDATA[<blockquote>
<p>Insbesondere der Test davor ist überflüssig.</p>
</blockquote>
<p>Die Prüfung vor Freigabe des Speichers werde ich entfernen.</p>
<blockquote>
<p>Und dann sollte sich immer der Bereitsteller des Speichers um die Freigabe kümmern, oder aber explizit die Besitzherrschaft übertragen. Woher z.B. weiß Deine Klasse, dass ein Array freigegeben werden muss? Der Rest ist ziemlich chaotisch.</p>
</blockquote>
<p>Das wirkliche Problem besteht darin, dass in DLL B ein Vektor im Vektor in ein Array gewandelt wird. Die Größe vom Array kann erst zur Laufzeit bestimmt werden. Sonst würde ich das ganze statisch machen und hätte das Problem mit delete nicht.</p>
<p>Der Zeiger im struct ist ja an sich statisch. Wenn ich in DLL B die unten aufgeführte Codezeile ausführe, muss dann der Speicher des Zeigers pulCallPath im struct dann freigegeben werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556599</guid><dc:creator><![CDATA[Caprio2L]]></dc:creator><pubDate>Wed, 30 Jul 2008 18:49:32 GMT</pubDate></item><item><title><![CDATA[Reply to [erledigt] delete notwendig oder nicht? on Wed, 30 Jul 2008 18:56:33 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn ich nicht den Speicher freigebe, entsteht dann ein memory leak?</p>
</blockquote>
<p>Überprüf das doch auch mal mit einem Analysis Tool. z.B<br />
<a href="http://valgrind.org/" rel="nofollow">http://valgrind.org/</a></p>
<p>Ansonsten gilt die Grundregel, dass du jeden Speicher, den du mit new/new[] anforderst auch wieder mit delete/delete[] freigeben musst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556605</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 30 Jul 2008 18:56:33 GMT</pubDate></item><item><title><![CDATA[Reply to [erledigt] delete notwendig oder nicht? on Thu, 31 Jul 2008 14:56:11 GMT]]></title><description><![CDATA[<p>Habe mein Problem nun gelöst, indem ich die betreffende Variable statisch gemacht habe. Die Lösung fiel mir erst nach sehr langem Beschäftigen mit dem Problem ein. Da das ursprünglich zur Laufzeit erstellte Array später sowieso auf eine gewisse Länge begrenzt wird, weil für eine Parameterübergabe nur begrenzter Speicherplatz zur Verfügung steht, hoffe ich, mit dieser Lösung auszukommen.</p>
<p>Danke für die Vorschläge und Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557097</guid><dc:creator><![CDATA[Caprio2L]]></dc:creator><pubDate>Thu, 31 Jul 2008 14:56:11 GMT</pubDate></item></channel></rss>