<?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[Destruktor von Subklasse über Basis?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich wundere mich gerade über folgendes Verhalten und bin mir nicht mehr meines Wissens sicher:<br />
Wenn ich en Destruktor eine Basisklasse aufrufe von der ander Subklassen erben - wird dann nicht automatisch der destruktor der subklassen aufgerufen?</p>
<p>Beispiel PSEUDOCODE:</p>
<pre><code class="language-cpp">class Base
{
   public:
      virtual ~Base() {};
}:
#include &lt;iostream&gt;
class Derived : public Base
{
   public:
        ~Derived() 
          {std::cout &lt;&lt; &quot;Wird nicht aufgerufen&quot; &lt;&lt; std::endl;}
};

int main()
{
    Base* base = NULL;
    Derived D1;
    Derived D2;

    base = &amp;D1;
    delete base;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/256603/destruktor-von-subklasse-über-basis</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 06:22:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/256603.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Dec 2009 13:10:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 13:10:49 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich wundere mich gerade über folgendes Verhalten und bin mir nicht mehr meines Wissens sicher:<br />
Wenn ich en Destruktor eine Basisklasse aufrufe von der ander Subklassen erben - wird dann nicht automatisch der destruktor der subklassen aufgerufen?</p>
<p>Beispiel PSEUDOCODE:</p>
<pre><code class="language-cpp">class Base
{
   public:
      virtual ~Base() {};
}:
#include &lt;iostream&gt;
class Derived : public Base
{
   public:
        ~Derived() 
          {std::cout &lt;&lt; &quot;Wird nicht aufgerufen&quot; &lt;&lt; std::endl;}
};

int main()
{
    Base* base = NULL;
    Derived D1;
    Derived D2;

    base = &amp;D1;
    delete base;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1822814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822814</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Tue, 15 Dec 2009 13:10:49 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 13:17:02 GMT]]></title><description><![CDATA[<p>Ist des Destruktor in der Basisklasse virtuell (so wie bei dir) wird natürlich immer der richtige aufgerufen, also der von Derived.</p>
<p>Dein Beispiel ist nur böse, weil D1 nicht mit new angelegt wurde, und somit automatisch gelöscht wird. Du zerstörst es aber schon durch das delete auf base. So etwas endet immer böse...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822819</guid><dc:creator><![CDATA[manni_meier]]></dc:creator><pubDate>Tue, 15 Dec 2009 13:17:02 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 14:09:34 GMT]]></title><description><![CDATA[<p>Danke - ich habe gerade bemerkt das mein Problem wo anders liegt:<br />
Ich verstehe nicht warum bei einer exception die ich mit throw werfe nicht<br />
die objekte über delete gelöscht werden. Läuft der code durch ohne exception wird alles wunderbar freigegeben - aber kommt die exception werden d1 und d2 nicht gelöscht. Warum? Und wie kann ich das umgehen?</p>
<p>Hier ein Minimalbeispiel in dem nicht alles freigegeben wird.<br />
Ich habe es nach meinem hauptcode nachkostruiert deswegen ist es ein wenig länger....</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;stdexcept&gt;
class Mtx
{
        public:
                Mtx() { a = new int[10];
                        b = new double[5];
                        c = new int[7];}
                ~Mtx() { if (a) delete [] a;
                if(b) delete [] b;
                if(c) delete [] c;}
                int* a;     
                double* b;
                int* c; 
};
class Base
{
        public:
           virtual ~Base() { };
           virtual Mtx* bar() = 0;
           virtual void foo() = 0;
};

class D1 : public Base
{
        public:
                D1() { mtx = NULL; }
                ~D1() { delete mtx; }
                void foo() {     
                        mtx = bar();                        
                }
                Mtx* bar() {
                   Mtx* mtx2 = new Mtx();    
                   //something happens
                   throw std::runtime_error(&quot;error&quot;);    
                   return mtx2;
                }
                Mtx* mtx;
};
class D2 : public Base
{
        public:
                D2() { mtx = NULL; }
                ~D2() { delete mtx; }

                void foo() {     
                  mtx = bar();                        
                }

                Mtx* bar() {
                     Mtx* mtx2 = new Mtx(); 
                     //something happens
                     throw std::runtime_error(&quot;error&quot;);      
                     return mtx2;
                }
                Mtx* mtx;
};

int main(int argc, char** argv)
{
        Base * base = NULL;
        D1 d1;
        D2 d2;

        if (1) base = &amp;d1;
        else base = &amp;d2;
        try {
           base-&gt;foo();
        }
        catch ( std::runtime_error&amp; ex )
        {
                //do something
        }

        return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1822861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822861</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Tue, 15 Dec 2009 14:09:34 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 14:16:27 GMT]]></title><description><![CDATA[<p>Der Zeiger wird zerstört, aber das Objekt was du mit new erzeugt hast, bleibt erhalten. Am einfachsten wäre es, wenn du die Objekte nicht mit new erzeugst, sondern auf dem Stack(heißt der so?), also einfach &quot;Mtx mtx;&quot;.</p>
<p>Du könntest auch noch SmartPointer verwenden, aber wird dann schon etwas komplizierter. Ne andere Programmiersprache wär vllt. auch ne Möglichkeit <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822869</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Tue, 15 Dec 2009 14:16:27 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 14:18:42 GMT]]></title><description><![CDATA[<p>Du musst doch echt nicht d1 und d2 konstruieren, wenn du nur Interesse an einem der beiden hast...</p>
<pre><code class="language-cpp">int main()
{
  Base *base;
  if(condition) base = new D1;
  else base = new D2;
  try {
    base-&gt;foo();
  } catch(const std::runtime_error&amp; e ) {
    // error behandeln
  } finally {
    delete base;
  }
}
</code></pre>
<p>Und nach einem bar() ist das Mtx (liegt auf dem Heap) Objekt nicht mehr erreichbar, für das bekommst du nie (egal ob mit oder ohne Exception) einen Destruktor-Aufruf...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822871</guid><dc:creator><![CDATA[manni_meier]]></dc:creator><pubDate>Tue, 15 Dec 2009 14:18:42 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 14:21:41 GMT]]></title><description><![CDATA[<p>manni_meier schrieb:</p>
<blockquote>
<p>...finally...</p>
</blockquote>
<p>finally gibt es nicht im C++ Standard. Dafür verwendet man RAII-Techniken (wie Smartpointer).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822873</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 15 Dec 2009 14:21:41 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 14:24:09 GMT]]></title><description><![CDATA[<p>manni_meier schrieb:</p>
<blockquote>
<p>} finally {<br />
delete base;<br />
}<br />
}[/cpp]</p>
</blockquote>
<p>finally gibt es in C++ nicht. Das kann höchstens eine Compiler Extension sein, welche jedoch nicht portabel zu anderen Compiler ist und daher ist es nicht ratsam darauf zurück zugreifen.</p>
<p>BR</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822874</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Tue, 15 Dec 2009 14:24:09 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 14:29:05 GMT]]></title><description><![CDATA[<p>Argh, sry, stimmt...<br />
Hab wohl in letzter Zeit zu viel mit D gespielt.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9974">@Mati</a>:<br />
Könntest du mal genau sagen, an welcher Stelle etwas (und auch WAS) deiner Meinung nach nicht läuft?<br />
Welches Objekt wird ohne Exception abgebaut?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822880</guid><dc:creator><![CDATA[manni_meier]]></dc:creator><pubDate>Tue, 15 Dec 2009 14:29:05 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 15:31:06 GMT]]></title><description><![CDATA[<p>Puh - also im Moment weiß ich echt nicht weiter wie ich das Problem angehen soll...</p>
<blockquote>
<p>Der Zeiger wird zerstört, aber das Objekt was du mit new erzeugt hast, bleibt erhalten. Am einfachsten wäre es, wenn du die Objekte nicht mit new erzeugst, sondern auf dem Stack(heißt der so?), also einfach &quot;Mtx mtx;&quot;.</p>
</blockquote>
<p>meinst du damit dass ich alle member der klasse die innerhalb d1/d2 liegt auf dem stack anlegen sollte? Allgemeine Frage: Wie lang leben denn die Member eines Objektes (O1) das selbst Member eine Objektes (O2) ist? So lange wie O2 lebt? Also ist das toplevel Objekt immer verantwortlich wie lange alle submember leben?</p>
<p>Also folgende Ausgabe - ich hoffe die Hilft weiter:</p>
<pre><code>valgrind --show-reachable=yes --leak-check=full ./out
==14218== Memcheck, a memory error detector.
==14218== Copyright (C) 2002-2006, and GNU GPL'd, by Julian Seward et al.
==14218== Using LibVEX rev 1658, a library for dynamic binary translation.
==14218== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP.
==14218== Using valgrind-3.2.1-Debian, a dynamic binary instrumentation framework.
==14218== Copyright (C) 2000-2006, and GNU GPL'd, by Julian Seward et al.
==14218== For more details, rerun with: -v
==14218==
==14218==
==14218== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 17 from 1)
==14218== malloc/free: in use at exit: 120 bytes in 4 blocks.
==14218== malloc/free: 6 allocs, 2 frees, 226 bytes allocated.
==14218== For counts of detected errors, rerun with: -v
==14218== searching for pointers to 4 not-freed blocks.
==14218== checked 109,052 bytes.
==14218==
==14218== 120 (12 direct, 108 indirect) bytes in 1 blocks are definitely lost in loss record 1 of 4
==14218==    at 0x4021DC5: operator new(unsigned) (vg_replace_malloc.c:163)
==14218==    by 0x8048D52: D1::bar() (in /home/mat/tmp/test/out)
==14218==    by 0x8048C35: D1::foo() (in /home/mat/tmp/test/out)
==14218==    by 0x8048B6C: main (in /home/mat/tmp/test/out)
==14218==
==14218==
==14218== 28 bytes in 1 blocks are indirectly lost in loss record 2 of 4
==14218==    at 0x4021A55: operator new[](unsigned) (vg_replace_malloc.c:195)
==14218==    by 0x8048D34: Mtx::Mtx() (in /home/mat/tmp/test/out)
==14218==    by 0x8048D60: D1::bar() (in /home/mat/tmp/test/out)
==14218==    by 0x8048C35: D1::foo() (in /home/mat/tmp/test/out)
==14218==    by 0x8048B6C: main (in /home/mat/tmp/test/out)
==14218==
==14218==
==14218== 40 bytes in 1 blocks are indirectly lost in loss record 3 of 4
==14218==    at 0x4021A55: operator new[](unsigned) (vg_replace_malloc.c:195)
==14218==    by 0x8048D20: Mtx::Mtx() (in /home/mat/tmp/test/out)
==14218==    by 0x8048D60: D1::bar() (in /home/mat/tmp/test/out)
==14218==    by 0x8048C35: D1::foo() (in /home/mat/tmp/test/out)
==14218==    by 0x8048B6C: main (in /home/mat/tmp/test/out)
==14218==
==14218==
==14218== 40 bytes in 1 blocks are indirectly lost in loss record 4 of 4
==14218==    at 0x4021A55: operator new[](unsigned) (vg_replace_malloc.c:195)
==14218==    by 0x8048D0D: Mtx::Mtx() (in /home/mat/tmp/test/out)
==14218==    by 0x8048D60: D1::bar() (in /home/mat/tmp/test/out)
==14218==    by 0x8048C35: D1::foo() (in /home/mat/tmp/test/out)
==14218==    by 0x8048B6C: main (in /home/mat/tmp/test/out)
==14218==
==14218== LEAK SUMMARY:
==14218==    definitely lost: 12 bytes in 1 blocks.
==14218==    indirectly lost: 108 bytes in 3 blocks.
==14218==      possibly lost: 0 bytes in 0 blocks.
==14218==    still reachable: 0 bytes in 0 blocks.
==14218==         suppressed: 0 bytes in 0 blocks.
</code></pre>
<p>Und auch mit folgendem bleibt der fehler erhalten - wenn ich nur eines der<br />
Objekte erstelle: WARUM wird in Zeile 28 NICHT der Destruktor von Mtx aufgerufen???</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;stdexcept&gt;
class Mtx
{
        public:
                Mtx() { a = new int[10];
                        b = new double[5];
                        c = new int[7];}
                ~Mtx() { if (a) delete [] a;
                if(b) delete [] b;
                if(c) delete [] c;}
                int* a;     
                double* b;
                int* c; 
};
class Base
{
        public:
           virtual ~Base() { };
           virtual Mtx* bar() = 0;
           virtual void foo() = 0;
};

class D1 : public Base
{
        public:
                D1() { mtx = NULL; }
                ~D1() { delete mtx; }
                void foo() {     
                        mtx = bar();                        
                }
                Mtx* bar() {
                   Mtx* mtx2 = new Mtx();    
                   //something happens
                   throw std::runtime_error(&quot;error&quot;);    
                   return mtx2;
                }
                Mtx* mtx;
};
class D2 : public Base
{
        public:
                D2() { mtx = NULL; }
                ~D2() { delete mtx; }

                void foo() {     
                  mtx = bar();                        
                }

                Mtx* bar() {
                     Mtx* mtx2 = new Mtx(); 
                     //something happens
                     throw std::runtime_error(&quot;error&quot;);      
                     return mtx2;
                }
                Mtx* mtx;
};

int main(int argc, char** argv)
{
        Base * base = NULL;

        if (true) base = new D1();
        else base = new D2();
        try {
           base-&gt;foo();
        }
        catch ( std::runtime_error&amp; ex )
        {
                delete base;
                //do something
                return 1;
        }
        delete base;

        return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1822897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822897</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Tue, 15 Dec 2009 15:31:06 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 15:39:37 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void foo() {    
mtx = bar(); // diese zuweisung findet nie statt                  
}

Mtx* bar() {
Mtx* mtx2 = new Mtx(); // mtx2 zeit auf dynamisch erzeugte Mtx
//something happens
throw std::runtime_error(&quot;error&quot;);   
// -&gt; abbruch. Der Zeiger mtx2 ist weg. 
// -&gt; niemand zeigt mehr auf das neue objekt
// -&gt; niemand kann es löschen   
return mtx2;
}
Mtx* mtx;
</code></pre>
<pre><code class="language-cpp">#include &lt;array&gt;
#include &lt;memory&gt;
#include &lt;stdexcept&gt;

class Mtx
{
public:
	std::tr1::array&lt;int,10&gt; a;    
	std::tr1::array&lt;double,5&gt; b;
	std::tr1::array&lt;int,7&gt; c;
};
class Base
{
public:
	typedef std::tr1::shared_ptr&lt;Mtx&gt; Mtx_ptr;
	virtual ~Base() { };
	virtual Mtx_ptr bar() = 0;
	virtual void foo() = 0;
};

class D1 : public Base
{
public:
        void foo() 
		{    
			mtx_ = bar();                  
        }

        Mtx_ptr bar() 
		{
			Mtx_ptr p(new Mtx());    
			//something happens
			throw std::runtime_error(&quot;error&quot;);    
			return p;
        }

private:
	Mtx_ptr mtx_;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1822935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822935</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Tue, 15 Dec 2009 15:39:37 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 15:46:53 GMT]]></title><description><![CDATA[<p>danke aber:</p>
<pre><code class="language-cpp">void foo() {    
mtx = bar(); // diese zuweisung findet nie statt                  
}
</code></pre>
<p>warum findet diesee zuweisung nie statt?</p>
<p>Und was zur HÖlle ist ein typedef std::tr1::shared_ptr&lt;Mtx&gt; Mtx_ptr; ? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822941</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Tue, 15 Dec 2009 15:46:53 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 15:57:22 GMT]]></title><description><![CDATA[<p>Mati schrieb:</p>
<blockquote>
<p>danke aber:</p>
<pre><code class="language-cpp">void foo() {    
mtx = bar(); // diese zuweisung findet nie statt                  
}
</code></pre>
<p>warum findet diesee zuweisung nie statt?</p>
</blockquote>
<p>Weil bar() eine Exception wirft. Wenn dies passiert, wird der Programmfluss vereinfacht gesprochen abgebrochen, und in den nächsten passenden catch-Block gesprungen. Dabei werden Stackvariablen noch aufgeräumt... [ERGÄNZUNG: Daher kommt es auch nicht zum return...]</p>
<p>Mati schrieb:</p>
<blockquote>
<p>Und was zur HÖlle ist ein typedef std::tr1::shared_ptr&lt;Mtx&gt; Mtx_ptr; ? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>1. Der Namensraum std sollte Bekannt sein (Der Namensraum der C++ Standardbibliothek). std::tr1 ist der Namensraum des Technical Reports 1, einer Ergänzung zum Standard.<br />
2. shared_ptr gehört zu der Gruppe der Smartpointer. Objekte, die sich beispielsweise selbst über Freigaben kümmern.</p>
<p>Mtx_ptr steht dank dem typedef als verkürzte Schreibweise für std::tr1::shared_ptr&lt;Mtx&gt;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822948</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 15 Dec 2009 15:57:22 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 15:57:42 GMT]]></title><description><![CDATA[<p>bar() wirft eine ausnahme, d.h. das das Program direkt bis zum nächst passenden catch handler 'springt', also zum den in der main funktion.</p>
<p>std::tr1::shared_ptr ist eine Templateklasse, die wie ein normaler Zeiger benutzt werden kann, aber die Speicherverwltung übernimmt.<br />
typedef ist eine Typdefinition, Mtx_ptr ist damit gleichbedeutend mit std::tr1::shared_ptr&lt;Mtx&gt;.</p>
<pre><code class="language-cpp">int main()
{
    typedef std::tr1::shared_ptr&lt;Mtx&gt; Mtx_ptr;
    {
    Mtx_ptr p(new Mtx);

    } //&lt;-- Destruktor von p wird aufgerufen. Dieser löscht das Objekt automatisch
   {
    Mtx_ptr p1(new Mtx);
    {
     Mtx_ptr p2=p1; // zwei shared_ptr zeigen auf 1Objekt
    }//&lt;-- Destruktor von p2 wird aufgerufen. Nihcts passiert
   }//&lt;-- Destruktor von p1 wird aufgerufen. Onjekt wird gelöscht

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1822949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822949</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Tue, 15 Dec 2009 15:57:42 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 16:29:28 GMT]]></title><description><![CDATA[<p>Danke für die Erklärung: Gäbe es eine Alternative zu Smart-Pointern? Bzw. sind diese über alle gängigen Compiler möglich? Der code soll möglichst portabel bleiben. Ich weiß nicht immer auf den TR1 zugegriffen werden kann ?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1822993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1822993</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Tue, 15 Dec 2009 16:29:28 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 16:54:03 GMT]]></title><description><![CDATA[<p>Mati schrieb:</p>
<blockquote>
<p>Danke für die Erklärung: Gäbe es eine Alternative zu Smart-Pointern? Bzw. sind diese über alle gängigen Compiler möglich?</p>
</blockquote>
<p>Grundsätzlich sollten alle aktuellen Compiler den TR1 unterstützen (der ist auch schon eine Weile gültig). Zudem kann man auch noch die Boost-Bibliothek nutzen (den die Smartpointer des TR1 sind im wesentlichen Boost entnommen wurden), die auch mit aktuellen Compilern arbeiten sollte.</p>
<p>Und zu Alternativen:<br />
a) Versuchen ob man auf dynamische Speicherallozierung verzichten kann, oder versuchen dies durch Container der Standardbibliothek &quot;zu verbergen&quot;.<br />
b) Dafür sorgen das im Exceptionfall noch ein catch-Block die Ressourcen freigegeben werden und dann die Exception weiterwerfen (wenn man sie nicht sinnvoll behandeln kann).</p>
<p>TR1 und Boost sind für mich ebenso wichtig wie die C++ Standardbibliothek, und sie enthalten viele sehr sinnvolle Dinge. Wobei man bei Smartpointern etwas aufpassen muss (der shared_ptr ist durchaus nützlich, aber auch der &quot;teuerste&quot; der Smartpointer; Sofern der Anwendungsfall Andere unterstützt sind diese vorzuziehen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823024</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 15 Dec 2009 16:54:03 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 19:13:22 GMT]]></title><description><![CDATA[<p>ja geht scho los...bei mir haut des mim smart-pointern net hin...</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;stdexcept&gt;
#include &lt;array&gt;
#include &lt;memory&gt;
#include &lt;stdexcept&gt; 
class Mtx
{
        public:
                Mtx() { a = new int[10];
                        b = new double[5];
                        c = new int[7];}
                ~Mtx() { if (a) delete [] a;
                if(b) delete [] b;
                if(c) delete [] c;}
                int* a;     
                double* b;
                int* c; 
};
class Base
{
        public:
           typedef std::tr1::shared_ptr&lt;Mtx&gt; Mtx_ptr; 
           virtual ~Base() { };
           virtual Mtx_ptr bar() = 0; 
           virtual void foo() = 0;
};

class D1 : public Base
{
        public:
                D1() { mtx = NULL; }
                ~D1() { delete mtx; }
                void foo() {     
                        mtx = bar();                        
                }
                Mtx_ptr bar()  {
                        Mtx_ptr p(new Mtx());     
                   //something happens
                   throw std::runtime_error(&quot;error&quot;);    
                   return p;
                }
        private:
                Mtx_ptr mtx_; 
};
class D2 : public Base
{
        public:
                D2() { mtx = NULL; }
                ~D2() { delete mtx; }

                void foo() {     
                  mtx = bar();                        
                }

                Mtx_ptr bar()  {
                        Mtx_ptr p(new Mtx()); 
                     //something happens
                     throw std::runtime_error(&quot;error&quot;);      
                     return p;
                }
        private:
                Mtx_ptr mtx_; 
};

int main(int argc, char** argv)
{
        Base * base = NULL;

        if (true) base = new D1();
        else base = new D2();
        try {
           base-&gt;foo();
        }
        catch ( std::runtime_error&amp; ex )
        {
                delete base;
                //do something
                return 1;
        }
        delete base;

        return 0;
}
</code></pre>
<pre><code>main.cpp:4:17: error: array: No such file or directory
main.cpp:23: Fehler: »std::tr1« wurde nicht deklariert
main.cpp:23: Fehler: ISO-C++ verbietet Deklaration von »shared_ptr« ohne Typ
main.cpp:23: Fehler: typedef-Name darf kein Spezifizierer mit geschachteltem Namen sein
main.cpp:23: Fehler: expected »;« before »&lt;« token
main.cpp:25: Fehler: »Mtx_ptr« bezeichnet keinen Typ
main.cpp:37: Fehler: »Mtx_ptr« bezeichnet keinen Typ
main.cpp:44: Fehler: »Mtx_ptr« bezeichnet keinen Typ
main.cpp: In constructor »D1::D1()«:
main.cpp:32: Fehler: »mtx« wurde in diesem Gültigkeitsbereich nicht definiert
main.cpp: In destructor »virtual D1::~D1()«:
main.cpp:33: Fehler: »mtx« wurde in diesem Gültigkeitsbereich nicht definiert
main.cpp: In member function »virtual void D1::foo()«:
main.cpp:35: Fehler: »mtx« wurde in diesem Gültigkeitsbereich nicht definiert
main.cpp:35: Fehler: »bar« wurde in diesem Gültigkeitsbereich nicht definiert
main.cpp: At global scope:
main.cpp:56: Fehler: »Mtx_ptr« bezeichnet keinen Typ
main.cpp:63: Fehler: »Mtx_ptr« bezeichnet keinen Typ
main.cpp: In constructor »D2::D2()«:
main.cpp:49: Fehler: »mtx« wurde in diesem Gültigkeitsbereich nicht definiert
main.cpp: In destructor »virtual D2::~D2()«:
main.cpp:50: Fehler: »mtx« wurde in diesem Gültigkeitsbereich nicht definiert
main.cpp: In member function »virtual void D2::foo()«:
main.cpp:53: Fehler: »mtx« wurde in diesem Gültigkeitsbereich nicht definiert
main.cpp:53: Fehler: »bar« wurde in diesem Gültigkeitsbereich nicht definiert
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1823088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823088</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Tue, 15 Dec 2009 19:13:22 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 19:20:45 GMT]]></title><description><![CDATA[<p>Du must noch den entsprechenden Header inkludieren:</p>
<pre><code class="language-cpp">#include &lt;tr1/memory&gt;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1823093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823093</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Tue, 15 Dec 2009 19:20:45 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor von Subklasse über Basis? on Tue, 15 Dec 2009 19:51:17 GMT]]></title><description><![CDATA[<p>joomoo schrieb:</p>
<blockquote>
<p>Du must noch den entsprechenden Header inkludieren:</p>
<pre><code class="language-cpp">#include &lt;tr1/memory&gt;
</code></pre>
</blockquote>
<p>Unter Microsoft Visual C++ nur <code>&lt;memory&gt;</code> .</p>
<p>Gibt es eigentlich Absichten, die Header des Technical Report 1 zu standardisieren, oder muss man als portabler TR1-Nutzer ständig mit bedingter Kompilierung arbeiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1823109</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1823109</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 15 Dec 2009 19:51:17 GMT</pubDate></item></channel></rss>