<?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[Destructor und delete]]></title><description><![CDATA[<p>Guten Tag,<br />
ich habe ein Problem mit dem Destruktor.</p>
<p>Eigentlich hatte ich vor in Klassen allokierte variablen am ende durch den Destruktor wieder freizugeben, jedoch führt meine momentane implementierung mit operation overload dazu, dass es mehrfach freigegeben wird.</p>
<p>Ich habe das problem mal vereinfacht hier in einen code schnipsel gegossen:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

class test
{ 
  int* value;
  public:
  test() {value= new int;*value=1;};
  ~test() {delete value;};

  void operator = (test b) {*value=*(b.value);};
};

int main(void)
{
  test a,b;
  a=b;
  return 0;
}
</code></pre>
<p>Ich würde dabei gerne verhindern, dass der &quot;a=b&quot; aufruf den Destruktor ausführt und es so natürlich zu fehlern kommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/301106/destructor-und-delete</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 07:40:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301106.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 19 Mar 2012 17:18:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Destructor und delete on Mon, 19 Mar 2012 17:18:11 GMT]]></title><description><![CDATA[<p>Guten Tag,<br />
ich habe ein Problem mit dem Destruktor.</p>
<p>Eigentlich hatte ich vor in Klassen allokierte variablen am ende durch den Destruktor wieder freizugeben, jedoch führt meine momentane implementierung mit operation overload dazu, dass es mehrfach freigegeben wird.</p>
<p>Ich habe das problem mal vereinfacht hier in einen code schnipsel gegossen:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

class test
{ 
  int* value;
  public:
  test() {value= new int;*value=1;};
  ~test() {delete value;};

  void operator = (test b) {*value=*(b.value);};
};

int main(void)
{
  test a,b;
  a=b;
  return 0;
}
</code></pre>
<p>Ich würde dabei gerne verhindern, dass der &quot;a=b&quot; aufruf den Destruktor ausführt und es so natürlich zu fehlern kommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2192951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2192951</guid><dc:creator><![CDATA[dajohnny]]></dc:creator><pubDate>Mon, 19 Mar 2012 17:18:11 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor und delete on Mon, 19 Mar 2012 17:25:12 GMT]]></title><description><![CDATA[<p>dajohnny schrieb:</p>
<blockquote>
<p>Ich würde dabei gerne verhindern, dass der &quot;a=b&quot; aufruf den Destruktor ausführt und es so natürlich zu fehlern kommt.</p>
</blockquote>
<p>1. Beim Zuweisungsoperator eine const-Referenz als Parameter übergeben<br />
2. Kopierkonstruktor implementieren, der fehlt auch noch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2192956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2192956</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 19 Mar 2012 17:25:12 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor und delete on Mon, 19 Mar 2012 18:41:00 GMT]]></title><description><![CDATA[<p>Edit: Ah, falsch gelesen. Sry.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2192992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2192992</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 19 Mar 2012 18:41:00 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor und delete on Mon, 19 Mar 2012 21:13:18 GMT]]></title><description><![CDATA[<p>Wie Bashar sagte, den Kopierkonstruktor implementieren und bei beiden den Parameter als const-Referenz übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193043</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Mon, 19 Mar 2012 21:13:18 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor und delete on Tue, 20 Mar 2012 00:32:13 GMT]]></title><description><![CDATA[<p>Dein Problem ist, etwas genauer beschrieben, das</p>
<pre><code class="language-cpp">void operator = (test b) {*value=*(b.value);};
</code></pre>
<p>den copy-ctor aufruft - da du denn hier aber nicht implementiert hast, macht der einfach ne flache kopie vom zeiger. Am Ende von operator= wird dieses wieder zerstört (erstes delete). Sobald du das objekt selbst zerstört, kommt auf denselben zeiger das zweite delete.<br />
Die Lösung wurde schon gesagt: const-Referenz und richtigen copy-ctor schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193080</guid><dc:creator><![CDATA[kleiner Troll]]></dc:creator><pubDate>Tue, 20 Mar 2012 00:32:13 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor und delete on Tue, 20 Mar 2012 07:31:58 GMT]]></title><description><![CDATA[<pre><code>test a,b;
</code></pre>
<p>Hier wurden sowohl a.value als auch b.value alloziiert</p>
<pre><code>a=b;
</code></pre>
<p>hier wird zunächst b kopiert, da der operator= ja eine temporäre Kopie des Objektes erwartet. Dabei zeigt b und die Kopie auf das selbe b.value. Wird das temporäre Objekt wieder gelöscht, wird b.value frei gegeben. Unglücklicherweise zeigt aber b noch darauf. Wenn main verlassen wird, wird der Destruktor von b aufgerufen, welcher b.value ein zweites mal frei gibt.</p>
<p>In der Regel ist es notwendig, sowohl den Kopierkonstruktor als auch den Zuweisungsoperator korrekt zu implementieren oder außer Kraft zu setzen, wenn so mit Zeigern umgegangen wird.</p>
<p>Das würde dann in etwa so aussehen (mit ein paar anderen kleinen Korrekturen):</p>
<pre><code>class test
{
    int* value;
  public:
    test() { value = new int; *value=1; }
    test(const test&amp; t) { value = new int; *value = *t.value; }
    ~test() {delete value; }

    test&amp; operator = (const test&amp; b) { *value=*b.value; return *this; }
};

int main(int argc, char* argv[])
{
  test a,b;
  a=b;
}
</code></pre>
<p>Wobei man sich natürlich fragen kann, welchen Sinn das macht, die Member als Zeiger anzulegen. Aber Du hast ja gesagt, dass das nur ein vereinfachtes Beispiel ist. Da ist es natürlich valide.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193097</guid><dc:creator><![CDATA[ich bins]]></dc:creator><pubDate>Tue, 20 Mar 2012 07:31:58 GMT</pubDate></item><item><title><![CDATA[Reply to Destructor und delete on Tue, 20 Mar 2012 10:18:18 GMT]]></title><description><![CDATA[<p>dajohnny schrieb:</p>
<blockquote>
<p>ich habe ein Problem mit dem Destruktor.</p>
</blockquote>
<p>Nee, so würde ich das nicht sagen. Dein Problem ist die Verletzung der <a href="http://de.wikipedia.org/wiki/Dreierregel_%28C%2B%2B%29" rel="nofollow">3er-Regel</a>.</p>
<p>dajohnny schrieb:</p>
<blockquote>
<pre><code>class test
{ 
  int* value;
  public:
  test() {value= new int;*value=1;};
  ~test() {delete value;};

  void operator = (test b) {*value=*(b.value);};
};
</code></pre>
</blockquote>
<p>Mal davon abgesehen, dass es hier natürlich absolut keinen Sinn macht, value als Zeiger anzulegen: Ja, hier hast Du die <a href="http://de.wikipedia.org/wiki/Dreierregel_%28C%2B%2B%29" rel="nofollow">3er-Regel</a> verletzt. Insbesondere fehlt hier der Kopierkonstruktor. Und b bei operator= sollte eine Referenz-auf-const sein.</p>
<p>dajohnny schrieb:</p>
<blockquote>
<p>Ich würde dabei gerne verhindern, dass der &quot;a=b&quot; aufruf den Destruktor ausführt</p>
</blockquote>
<p>Das tut er doch gar nicht!</p>
<p>dajohnny schrieb:</p>
<blockquote>
<p>und es so natürlich zu fehlern kommt.</p>
</blockquote>
<p>Du verletzt ja auch die <a href="http://de.wikipedia.org/wiki/Dreierregel_%28C%2B%2B%29" rel="nofollow">3er-Regel</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2193153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2193153</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 20 Mar 2012 10:18:18 GMT</pubDate></item></channel></rss>