<?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[Wie löscht man die Instanz der Basisklasse?]]></title><description><![CDATA[<p>Hi,</p>
<p>in meinem Programm wird im Konstruktor einer erbenden Klasse die Basisklasse aufgerufen:</p>
<pre><code class="language-cpp">Child::Child() : Parent() {
...
}
</code></pre>
<p>Im Destruktor von &quot;Child&quot; gebe ich die Membervariablen frei, was aber passiert mit der Parent-Instanz? Wie kann ich den damit verbundenen Speicher wieder freigeben?<br />
Wird der Destruktor von Parent automatisch gerufen, wenn ich<br />
delete myChild;<br />
aufrufe?</p>
<p>Gruß, Thomas.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/150216/wie-löscht-man-die-instanz-der-basisklasse</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 13:44:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/150216.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Jun 2006 09:03:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie löscht man die Instanz der Basisklasse? on Thu, 15 Jun 2006 07:57:30 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>in meinem Programm wird im Konstruktor einer erbenden Klasse die Basisklasse aufgerufen:</p>
<pre><code class="language-cpp">Child::Child() : Parent() {
...
}
</code></pre>
<p>Im Destruktor von &quot;Child&quot; gebe ich die Membervariablen frei, was aber passiert mit der Parent-Instanz? Wie kann ich den damit verbundenen Speicher wieder freigeben?<br />
Wird der Destruktor von Parent automatisch gerufen, wenn ich<br />
delete myChild;<br />
aufrufe?</p>
<p>Gruß, Thomas.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1077393</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1077393</guid><dc:creator><![CDATA[Thomas++]]></dc:creator><pubDate>Thu, 15 Jun 2006 07:57:30 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man die Instanz der Basisklasse? on Wed, 14 Jun 2006 09:17:11 GMT]]></title><description><![CDATA[<p>Sofern der dtor virtual ist wird erst der Destruktor der abgeleiteten und dann (automatisch) der der Basisklasse aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1077409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1077409</guid><dc:creator><![CDATA[templäd]]></dc:creator><pubDate>Wed, 14 Jun 2006 09:17:11 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man die Instanz der Basisklasse? on Wed, 14 Jun 2006 09:20:48 GMT]]></title><description><![CDATA[<p>Der Destruktor braucht noch nicht mal virtuell zu sein. Der Destruktor der Basisklasse wird immer aufgerufen, wenn das Objekt zerstört wird.</p>
<p>Ausserdem brauchst Du den leeren Konstruktor der Basisklasse nicht explizit aufzurufen. Es geht auch mit:</p>
<pre><code class="language-cpp">Child::Child() {
...
}
</code></pre>
<p>Hier wird automatisch der Konstruktor ohne Parameter der Basisklasse aufgerufen.</p>
<p>Tntnet</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1077413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1077413</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Wed, 14 Jun 2006 09:20:48 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man die Instanz der Basisklasse? on Wed, 14 Jun 2006 09:40:09 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Der Destruktor braucht noch nicht mal virtuell zu sein. Der Destruktor der Basisklasse wird immer aufgerufen, wenn das Objekt zerstört wird.</p>
</blockquote>
<p>Nein. Wenn der Destruktor der Basisklasse nicht virtuell ist, ist das Verhalten beim delete undefiniert. Und undefiniert ist boese!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1077423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1077423</guid><dc:creator><![CDATA[Apollon]]></dc:creator><pubDate>Wed, 14 Jun 2006 09:40:09 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man die Instanz der Basisklasse? on Wed, 14 Jun 2006 09:43:48 GMT]]></title><description><![CDATA[<p>Apollon schrieb:</p>
<blockquote>
<p>tntnet schrieb:</p>
<blockquote>
<p>Der Destruktor braucht noch nicht mal virtuell zu sein. Der Destruktor der Basisklasse wird immer aufgerufen, wenn das Objekt zerstört wird.</p>
</blockquote>
<p>Nein. Wenn der Destruktor der Basisklasse nicht virtuell ist, ist das Verhalten beim delete undefiniert. Und undefiniert ist boese!</p>
</blockquote>
<p>es ist nur undefiniert, wenn das argument des delete ein zeiger auf diese basisklasse ohne virtuellen destruktor ist. es gibt keinen hinweis, dass das hier der fall sein soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1077425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1077425</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 14 Jun 2006 09:43:48 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man die Instanz der Basisklasse? on Wed, 14 Jun 2006 11:44:55 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class A
{
  public:
    ~A()  { std::cout &lt;&lt; &quot;Destruktor A&quot; &lt;&lt; std::endl; }
};

class B : public A
{
  public:
    ~B()  { std::cout &lt;&lt; &quot;Destruktor B&quot; &lt;&lt; std::endl; }
};

void f()
{
  A* a = new B();
  delete a;      // hier wird nur der Destruktor von A aufgerufen,
                 // da der Zeiger vom statische Typ A* ist

  B* b = new B();
  delete b;      // hier wird erst ~B, dann ~A aufgerufen, also korrekt,
                 // obwohl der Destruktor nicht virtuell ist
}
</code></pre>
<p>Im Gegesatz dazu:</p>
<pre><code class="language-cpp">class A
{
  public:
    virtual ~A()  { std::cout &lt;&lt; &quot;Destruktor A&quot; &lt;&lt; std::endl; }
};

class B : public A
{
  public:
    ~B()  { std::cout &lt;&lt; &quot;Destruktor B&quot; &lt;&lt; std::endl; }
};

void f()
{
  A* a = new B();
  delete a;      // hier wird der Destruktor von B und dann der Destruktor A aufgerufen,
                 // da der Compiler weiß, daß er den Destruktor von A über die
                 // vtable adressieren muß, da er ja virtuell ist

  B* b = new B();
  delete b;      // hier wird erst ~B, dann ~A aufgerufen
}
</code></pre>
<p>Fazit: Der Destruktor muß nur dann virtuell sein, wenn ich einen delete über einen Zeiger auf die Basisklasse ausführe. Destruktoren verhalten sich da genau so, wie Methoden.</p>
<p>Ich könnte ja hier noch ein Beispiel mit Methoden bringen:</p>
<pre><code class="language-cpp">class A
{
  public:
    virtual v()  { std::cout &lt;&lt; &quot;A::v&quot; &lt;&lt; std::endl; }
    f()  { std::cout &lt;&lt; &quot;A::f&quot; &lt;&lt; std::endl; }
};

class B : public A
{
  public:
    virtual v()  { std::cout &lt;&lt; &quot;B::v&quot; &lt;&lt; std::endl; }
    f()  { std::cout &lt;&lt; &quot;B::f&quot; &lt;&lt; std::endl; }
};

void f()
{
  A* a = new B;
  a-&gt;v();        // hier wird über die vtable B::v gefunden
  a-&gt;f();        // wie beim Destruktor wird hier nicht in der vtable gesucht,
                 // sondern einfach A::f aufgerufen
}
</code></pre>
<p>Tntnet</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1077522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1077522</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Wed, 14 Jun 2006 11:44:55 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man die Instanz der Basisklasse? on Wed, 14 Jun 2006 17:56:26 GMT]]></title><description><![CDATA[<p>Und trotzdem knallt es bei mir den Speicher langsam voll. Mal 4kB, mal 8kB, mal 12kB, immer schöne Vielfache von 4096 Bytes <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Habe eine Basisklasse, in der per CoCreateInstance ein Pointer auf ein XML-DOM-Dokument erzeugt wird, danach wird das Dokument vorstrukturiert und als Membervariable abgelegt.<br />
Die abgeleiteten Klassen stellen jeweils eine Klasse von XML-Dokumenten dar, die mit dem Pointer der Basisklasse weiterarbeiten.<br />
Der Pointer sollte im Destruktor der Basisklasse wieder freigegeben werden, allerdings verändert sich die Größe des Arbeitsspeichers nach dem Release()-Aufruf nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1077814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1077814</guid><dc:creator><![CDATA[Thomas++]]></dc:creator><pubDate>Wed, 14 Jun 2006 17:56:26 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man die Instanz der Basisklasse? on Wed, 14 Jun 2006 18:19:59 GMT]]></title><description><![CDATA[<p>Setz nen Breakpoint im Basusklassen-Destruktor und debugge deine Anwendung, dann siehst wann er in den Destruktor reinkommt.</p>
<p>Ansonsten musst mal Code zeigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1077827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1077827</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Wed, 14 Jun 2006 18:19:59 GMT</pubDate></item><item><title><![CDATA[Reply to Wie löscht man die Instanz der Basisklasse? on Thu, 15 Jun 2006 07:56:31 GMT]]></title><description><![CDATA[<p>Er geht wie geplant in den Destruktor und führt auch Release() aus, um den per CoCreateInstance() erzeugten Interface-Pointer freizugeben. Nur der Speicher kommt nicht zurück.<br />
Es handelt sich um eine ISAPI-Extension, lasse ich den selben Vorgang im Rahmen einer Desktop-Anwendung laufen, wird der Speicher seltsamerweise korrekt freigegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1077974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1077974</guid><dc:creator><![CDATA[Thomas++]]></dc:creator><pubDate>Thu, 15 Jun 2006 07:56:31 GMT</pubDate></item></channel></rss>