<?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[Kein Aufruf des Destruktors (Compilerabhängig?)]]></title><description><![CDATA[<p>Hier wird der Destruktor nicht aufgerufen.</p>
<pre><code class="language-cpp">#include &lt;iostream.h&gt;

enum BREED{GOLDEN, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAB};

class Mammal{

    public: 
        Mammal();
        ~Mammal();

        int GetAge() const {return itsAge;}
        void SetAge(int age) {itsAge=age;}
        int GetWeight() const {return itsWeight;}
        void SetWeight(int weight){itsWeight=weight;}

        void Speak() const {cout &lt;&lt; &quot;Saeugetier, gib Laut!\n&quot;;}
        void Sleep() const {cout &lt;&lt; &quot;Psst. Ich schlafe.\n&quot;;}

    protected:
        int itsAge;
        int itsWeight;
};

class Dog : public Mammal
{
 public:
     Dog();
     ~Dog();

        BREED GetBreed() const { return itsBreed;}
        void SetBreed(BREED breed){ itsBreed=breed;}

           void WagTail(){cout &lt;&lt; &quot;Schwanzwedeln...\n&quot;;}
           void BegForFood(){cout &lt;&lt; &quot;Um Futter betteln...\n&quot;;}

 protected:
     BREED itsBreed;   
};    

Mammal::Mammal():itsAge(1),itsWeight(5)
{
    cout &lt;&lt; &quot;MammalKonstruktor\n&quot;;    
}    

Mammal::~Mammal()
{
    cout &lt;&lt; &quot;MammalDestruktor\n&quot;;    
}    

Dog::Dog():itsBreed(GOLDEN)
{
 cout &lt;&lt; &quot;DogKontruktor\n&quot;;   
}    
Dog::~Dog()
{
    cout &lt;&lt; &quot;DogDestruktor\n&quot;;    
}    

int main(){

 Dog difo;
 difo.Speak();
 difo.WagTail();
 cout &lt;&lt; &quot;Difo (der Hund) ist &quot; &lt;&lt; difo.GetAge() &lt;&lt; &quot; Jahr(e) alt.\n&quot;;
    system(&quot;pause&quot;);   
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/207344/kein-aufruf-des-destruktors-compilerabhängig</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 05:04:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/207344.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Mar 2008 11:41:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kein Aufruf des Destruktors (Compilerabhängig?) on Thu, 06 Mar 2008 11:41:39 GMT]]></title><description><![CDATA[<p>Hier wird der Destruktor nicht aufgerufen.</p>
<pre><code class="language-cpp">#include &lt;iostream.h&gt;

enum BREED{GOLDEN, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAB};

class Mammal{

    public: 
        Mammal();
        ~Mammal();

        int GetAge() const {return itsAge;}
        void SetAge(int age) {itsAge=age;}
        int GetWeight() const {return itsWeight;}
        void SetWeight(int weight){itsWeight=weight;}

        void Speak() const {cout &lt;&lt; &quot;Saeugetier, gib Laut!\n&quot;;}
        void Sleep() const {cout &lt;&lt; &quot;Psst. Ich schlafe.\n&quot;;}

    protected:
        int itsAge;
        int itsWeight;
};

class Dog : public Mammal
{
 public:
     Dog();
     ~Dog();

        BREED GetBreed() const { return itsBreed;}
        void SetBreed(BREED breed){ itsBreed=breed;}

           void WagTail(){cout &lt;&lt; &quot;Schwanzwedeln...\n&quot;;}
           void BegForFood(){cout &lt;&lt; &quot;Um Futter betteln...\n&quot;;}

 protected:
     BREED itsBreed;   
};    

Mammal::Mammal():itsAge(1),itsWeight(5)
{
    cout &lt;&lt; &quot;MammalKonstruktor\n&quot;;    
}    

Mammal::~Mammal()
{
    cout &lt;&lt; &quot;MammalDestruktor\n&quot;;    
}    

Dog::Dog():itsBreed(GOLDEN)
{
 cout &lt;&lt; &quot;DogKontruktor\n&quot;;   
}    
Dog::~Dog()
{
    cout &lt;&lt; &quot;DogDestruktor\n&quot;;    
}    

int main(){

 Dog difo;
 difo.Speak();
 difo.WagTail();
 cout &lt;&lt; &quot;Difo (der Hund) ist &quot; &lt;&lt; difo.GetAge() &lt;&lt; &quot; Jahr(e) alt.\n&quot;;
    system(&quot;pause&quot;);   
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1469280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1469280</guid><dc:creator><![CDATA[david3252]]></dc:creator><pubDate>Thu, 06 Mar 2008 11:41:39 GMT</pubDate></item><item><title><![CDATA[Reply to Kein Aufruf des Destruktors (Compilerabhängig?) on Thu, 06 Mar 2008 11:45:51 GMT]]></title><description><![CDATA[<p>1. Destruktoren virtuell machen<br />
2. nimm endl statt &quot;\n&quot;, da endl auch die Ausgabe flusht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1469282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1469282</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Thu, 06 Mar 2008 11:45:51 GMT</pubDate></item><item><title><![CDATA[Reply to Kein Aufruf des Destruktors (Compilerabhängig?) on Thu, 06 Mar 2008 11:49:29 GMT]]></title><description><![CDATA[<p>Mit virtuellen Klassen hab ich mich noch nicht befasst.<br />
Danke trotzdem! Vorallem für endl.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1469285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1469285</guid><dc:creator><![CDATA[david3252]]></dc:creator><pubDate>Thu, 06 Mar 2008 11:49:29 GMT</pubDate></item><item><title><![CDATA[Reply to Kein Aufruf des Destruktors (Compilerabhängig?) on Thu, 06 Mar 2008 11:55:12 GMT]]></title><description><![CDATA[<p>1. Destruktoren werden hier korrenkt aufgerufen<br />
2. Verwende iostream ohne .h und den namespace std.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1469289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1469289</guid><dc:creator><![CDATA[Wickelente]]></dc:creator><pubDate>Thu, 06 Mar 2008 11:55:12 GMT</pubDate></item><item><title><![CDATA[Reply to Kein Aufruf des Destruktors (Compilerabhängig?) on Thu, 06 Mar 2008 11:57:08 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>1. Destruktoren virtuell machen</p>
</blockquote>
<p>Hat hier nichts mit dem beschriebenen Problem zu tun.</p>
<p>Fellhuhn schrieb:</p>
<blockquote>
<p>2. nimm endl statt &quot;\n&quot;, da endl auch die Ausgabe flusht.</p>
</blockquote>
<p>Wird hier auch nicht helfen. Der Destruktor wird erst nach system(&quot;pause&quot;) aufgerufen. Da diese Anweisung vermutlich den Zweck hat, das Konsolenfenster offen zu halten, sieht man davon aber nichts mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1469292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1469292</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Thu, 06 Mar 2008 11:57:08 GMT</pubDate></item><item><title><![CDATA[Reply to Kein Aufruf des Destruktors (Compilerabhängig?) on Thu, 06 Mar 2008 12:06:48 GMT]]></title><description><![CDATA[<p>virtual ist hier wichtig. Wenn du eine Klasse erzeugst, von der abgeleitet werden soll, muß deren Destruktor virtual sein, da er sonst in der abgeleiteten Klasse nicht aufgerufen werden kann.</p>
<p>[edit] Ich sollte die Beiträge gründlicher lesen. Sowohl MFK als auch wickelente haben natürlich Recht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> [edit]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1469293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1469293</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 06 Mar 2008 12:06:48 GMT</pubDate></item><item><title><![CDATA[Reply to Kein Aufruf des Destruktors (Compilerabhängig?) on Thu, 06 Mar 2008 12:00:03 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>virtual ist hier wichtig. Wenn du eine Klasse erzeugst, von der abgeleitet werden soll, muß deren Destruktor virtual sein, da er sonst in der abgeleiteten Klasse nicht aufgerufen werden kann.</p>
</blockquote>
<p>Die Begründung ist falsch. Wenn der Destruktor nicht virtuell ist, geht es in die Hose, wenn ein Objekt der abgeleiteten Klasse über einen Zeiger auf die Basisklasse zerstört wird. Solange hier nur mit automatischen Variablen gearbeitet wird, ist das unnötig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1469295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1469295</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Thu, 06 Mar 2008 12:00:03 GMT</pubDate></item><item><title><![CDATA[Reply to Kein Aufruf des Destruktors (Compilerabhängig?) on Thu, 06 Mar 2008 12:01:03 GMT]]></title><description><![CDATA[<p>Es geht dabei ja nicht um virtuelle Klassen, sondern darum einfach nur den Destruktor durch ein vorstellen von virtual zu &quot;verbessern&quot;. Denn ansonsten wird der Destruktor nicht in allen Fällen korrekt aufgerufen, da kein Eintrag in der vtable vorliegt.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">class Base{
  int *a;

public:
  Base(){ a = new int[100]; }
  ~Base(){ delete[] a; }
};

class More : public Base{
  int *b;
  More() : Base(){ b = new int[100]; }
  ~More(){ delete[] b; }
};

//...
 Base *b = (Base*)new More();
 delete b;
</code></pre>
<p>In dem Fall würde jetzt nur der Base-Destruktor ausgeführt werden, nicht der von More. Und schon hättest du ein Speicherleck. Ein virtualer Destruktor verhindert das.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1469296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1469296</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Thu, 06 Mar 2008 12:01:03 GMT</pubDate></item><item><title><![CDATA[Reply to Kein Aufruf des Destruktors (Compilerabhängig?) on Thu, 06 Mar 2008 12:02:52 GMT]]></title><description><![CDATA[<p>Klingt alles intressant, aber das hat trotzdem nichts mit der Frage des OP zu tun.</p>
<p>Lösung: Die Ausgabe erfolgt nach deinem system-Aufruf, wahrscheinlich siehst du sie nur nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1469297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1469297</guid><dc:creator><![CDATA[Wickelente]]></dc:creator><pubDate>Thu, 06 Mar 2008 12:02:52 GMT</pubDate></item><item><title><![CDATA[Reply to Kein Aufruf des Destruktors (Compilerabhängig?) on Thu, 06 Mar 2008 12:05:37 GMT]]></title><description><![CDATA[<p>Den Destruktor in der Basis Klasse<br />
entweder:<br />
- public und virtuell machen<br />
oder:<br />
- protected und nicht virtuell</p>
<p>Herb Sutter oder sonst einer der C++ Gurus.</p>
<p>Gruss Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1469298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1469298</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Thu, 06 Mar 2008 12:05:37 GMT</pubDate></item><item><title><![CDATA[Reply to Kein Aufruf des Destruktors (Compilerabhängig?) on Thu, 06 Mar 2008 12:07:33 GMT]]></title><description><![CDATA[<p>Mach ein extra Scope um die Zerstörung zu forcieren.</p>
<pre><code class="language-cpp">int main()
{
 {
  Dog difo;
  difo.Speak();
  difo.WagTail();
  cout &lt;&lt; &quot;Difo (der Hund) ist &quot; &lt;&lt; difo.GetAge() &lt;&lt; &quot; Jahr(e) alt.\n&quot;;
 }
 system(&quot;pause&quot;);  
 return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1469301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1469301</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Thu, 06 Mar 2008 12:07:33 GMT</pubDate></item><item><title><![CDATA[Reply to Kein Aufruf des Destruktors (Compilerabhängig?) on Thu, 06 Mar 2008 12:08:21 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Es geht dabei ja nicht um virtuelle Klassen, sondern darum einfach nur den Destruktor durch ein vorstellen von virtual zu &quot;verbessern&quot;. Denn ansonsten wird der Destruktor nicht in allen Fällen korrekt aufgerufen, da kein Eintrag in der vtable vorliegt.</p>
</blockquote>
<p>und das *muss* nicht immer ein fehler sein. wenn man nicht polymorph arbeitet, dann ist es bestenfalls eine verschlimmbesserung. man glaubt gar nicht, wo virtuelle destruktoren überall überflüssig sein können:</p>
<pre><code class="language-cpp">struct Base
{
   ~Base () {}
};

struct Derived : Base
{
   ~Derived () {}
};

Derived make_some ()
{
   return Derived();
}

int main ()
{
   Base const&amp; base_ref = make_some();
}
</code></pre>
<p>wunderbar, nicht?</p>
<p>aber generelle aussagen wie &quot;wenn du von einer klasse ableitest, dann <em>musst</em> du den destruktor virtuell machen&quot; treffen es meistens nicht (oft genug vielleicht).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1469302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1469302</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Thu, 06 Mar 2008 12:08:21 GMT</pubDate></item><item><title><![CDATA[Reply to Kein Aufruf des Destruktors (Compilerabhängig?) on Thu, 06 Mar 2008 14:29:09 GMT]]></title><description><![CDATA[<p>Danke, Grundlagen helfen oft weiter (Scopes).</p>
<p>Danke für alle Bemühungen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1469430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1469430</guid><dc:creator><![CDATA[david3252]]></dc:creator><pubDate>Thu, 06 Mar 2008 14:29:09 GMT</pubDate></item></channel></rss>