<?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[Destruktoren richtig einsetzen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe mal eine Frage zu Destuktoren.<br />
Wenn ich eine neue UNIT erzeuge und in dieser eine Klasse definiere, dann<br />
kann es ja sein, dass ich bestimmte BCB-Komponenten als Membervariablen der Klasse definiere. Speicher reserviere ich dann im Konstruktor der Klasse, wie z.B.:<br />
(ist nur ein Bsp-Programm)</p>
<pre><code class="language-cpp">c_Klasse::c_Klasse()
{
   m_pSMTP = new TNMSMTP(Application);
   m_pStringList = new TStringList();

}
</code></pre>
<p>den Destruktor habe ich folgendermaßen definiert:</p>
<pre><code class="language-cpp">c_Klasse::~c_Klasse()
{
   delete m_pSMTP;
   delete m_pStringList;
}
</code></pre>
<p>Wenn ich nun mein Programm laufen lasse, wird dann der Destuktor automatisch aufgerufen, wenn z.B. ein</p>
<blockquote>
<p>exit(0);</p>
</blockquote>
<p>im Programmcode auftaucht, oder muss man diesen explizit aufrufen?<br />
Und ist es so, dass wenn ich ein</p>
<blockquote>
<p>new</p>
</blockquote>
<p>benutze ich dieses Objekt dann immer wieder killen muss oder wird dieser Speicher bei Programmende generell wieder freigegeben?</p>
<p>Vielen Dank für die Antworten!</p>
<p>Hier mal der komplette Code des Beispielprogramms:</p>
<p>Klasse.cpp:</p>
<pre><code class="language-cpp">c_Klasse::c_Klasse()
{
   m_pSMTP = new TNMSMTP(Application);
   m_pStringList = new TStringList();

}

void c_Klasse::macheWas()
{
   m_pStringList-&gt;Add(&quot;Das ist ein Test&quot;);
   m_pStringList-&gt;Add(&quot;Ende.&quot;);
}

c_Klasse::~c_Klasse()
{
   delete m_pSMTP;
   delete m_pStringList;
}
</code></pre>
<p>Klasse.h:</p>
<pre><code class="language-cpp">class c_Klasse
{
   private:

   TNMSMTP   *m_pSMTP;

   public:

   c_Klasse();
   ~c_Klasse();

   TStringList    *m_pStringList;

   void macheWas();

};
</code></pre>
<p>Test.cpp:</p>
<pre><code class="language-cpp">#include &lt;vcl.h&gt;
#pragma hdrstop

#include &quot;Test.h&quot;
#include &quot;Klasse.h&quot;

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource &quot;*.dfm&quot;
TForm1 *Form1;
c_Klasse *cklasse = new c_Klasse();

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   cklasse-&gt;macheWas();

   AnsiString asText = cklasse-&gt;m_pStringList-&gt;Text;

   exit(0);

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/154543/destruktoren-richtig-einsetzen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 09 Aug 2026 17:38:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/154543.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Jul 2006 06:20:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Destruktoren richtig einsetzen on Fri, 28 Jul 2006 06:20:23 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe mal eine Frage zu Destuktoren.<br />
Wenn ich eine neue UNIT erzeuge und in dieser eine Klasse definiere, dann<br />
kann es ja sein, dass ich bestimmte BCB-Komponenten als Membervariablen der Klasse definiere. Speicher reserviere ich dann im Konstruktor der Klasse, wie z.B.:<br />
(ist nur ein Bsp-Programm)</p>
<pre><code class="language-cpp">c_Klasse::c_Klasse()
{
   m_pSMTP = new TNMSMTP(Application);
   m_pStringList = new TStringList();

}
</code></pre>
<p>den Destruktor habe ich folgendermaßen definiert:</p>
<pre><code class="language-cpp">c_Klasse::~c_Klasse()
{
   delete m_pSMTP;
   delete m_pStringList;
}
</code></pre>
<p>Wenn ich nun mein Programm laufen lasse, wird dann der Destuktor automatisch aufgerufen, wenn z.B. ein</p>
<blockquote>
<p>exit(0);</p>
</blockquote>
<p>im Programmcode auftaucht, oder muss man diesen explizit aufrufen?<br />
Und ist es so, dass wenn ich ein</p>
<blockquote>
<p>new</p>
</blockquote>
<p>benutze ich dieses Objekt dann immer wieder killen muss oder wird dieser Speicher bei Programmende generell wieder freigegeben?</p>
<p>Vielen Dank für die Antworten!</p>
<p>Hier mal der komplette Code des Beispielprogramms:</p>
<p>Klasse.cpp:</p>
<pre><code class="language-cpp">c_Klasse::c_Klasse()
{
   m_pSMTP = new TNMSMTP(Application);
   m_pStringList = new TStringList();

}

void c_Klasse::macheWas()
{
   m_pStringList-&gt;Add(&quot;Das ist ein Test&quot;);
   m_pStringList-&gt;Add(&quot;Ende.&quot;);
}

c_Klasse::~c_Klasse()
{
   delete m_pSMTP;
   delete m_pStringList;
}
</code></pre>
<p>Klasse.h:</p>
<pre><code class="language-cpp">class c_Klasse
{
   private:

   TNMSMTP   *m_pSMTP;

   public:

   c_Klasse();
   ~c_Klasse();

   TStringList    *m_pStringList;

   void macheWas();

};
</code></pre>
<p>Test.cpp:</p>
<pre><code class="language-cpp">#include &lt;vcl.h&gt;
#pragma hdrstop

#include &quot;Test.h&quot;
#include &quot;Klasse.h&quot;

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource &quot;*.dfm&quot;
TForm1 *Form1;
c_Klasse *cklasse = new c_Klasse();

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   cklasse-&gt;macheWas();

   AnsiString asText = cklasse-&gt;m_pStringList-&gt;Text;

   exit(0);

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1105803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1105803</guid><dc:creator><![CDATA[skluge]]></dc:creator><pubDate>Fri, 28 Jul 2006 06:20:23 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoren richtig einsetzen on Fri, 28 Jul 2006 07:01:01 GMT]]></title><description><![CDATA[<p>Wenn ich ein Objekt einer Klasse mit new erzeuge, und dieses Objekt von einer Klasse stammt die in ihrem Konstruktor mehrere Komponenten mit new erzeugt,<br />
werden dann mit</p>
<p>&quot;delete objekt&quot; gleichzeitig die Komponenten auch deleted oder muss dieses explizit noch passieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1105826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1105826</guid><dc:creator><![CDATA[skluge]]></dc:creator><pubDate>Fri, 28 Jul 2006 07:01:01 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoren richtig einsetzen on Fri, 28 Jul 2006 07:22:34 GMT]]></title><description><![CDATA[<p>skluge schrieb:</p>
<blockquote>
<p>werden dann mit<br />
&quot;delete objekt&quot; gleichzeitig die Komponenten auch deleted...</p>
</blockquote>
<p>Solange diese innerhalb der Klasse erzeugten Objekte im Destruktor der Klasse wieder 'deleted' werden: Ja.<br />
Es geschieht also implizit, da durch das delete der Destruktor aufgerufen wird.<br />
Das kannst Du (fast) beliebig tief schachteln.</p>
<p>[Edit] Oder meinst Du Klassen, die von anderen Klassen abgeleitet sind? Aber auch hier: Ja. Der Destruktor der Basisklasse wird ebenfalls durchlaufen, wenn der Destruktur der abgeleiteten Klasse aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1105836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1105836</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 28 Jul 2006 07:22:34 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoren richtig einsetzen on Fri, 28 Jul 2006 07:22:59 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>allerdings ist dein Codebeispiel zum Beispiel Beispiel für ein Speicherloch. Denn der Speicher von</p>
<blockquote>
<p>c_Klasse *cklasse = new c_Klasse();</p>
</blockquote>
<p>wird niht wieder freigegeben, und auch der Destruktor davon wird nicht aufgerufen.<br />
Zum einen solltest du aus der globalen Instanz eine Memberinstanz des Forms machen. Denn dann kannst du std::auto_ptr verwenden, um automatisch mit beenden des Forms auch die Instanz löschen zu lassen, ohne extr noch den Destruktor des Forms schreiben zu müssen.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1105844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1105844</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 28 Jul 2006 07:22:59 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoren richtig einsetzen on Fri, 28 Jul 2006 07:24:56 GMT]]></title><description><![CDATA[<p>Eek, das hatte ich völlig übesehen, akari hat natürlich völlig recht.</p>
<p>Globale Variablen sind böse. Siehe auch den FAQ-Beitrag dazu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1105847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1105847</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 28 Jul 2006 07:24:56 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoren richtig einsetzen on Fri, 28 Jul 2006 07:42:10 GMT]]></title><description><![CDATA[<p>Danke schon mal für eure Antwort;</p>
<p>Meint ihr das dann vielleicht so:</p>
<p>Test.cpp:</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#include &lt;vcl.h&gt;
#pragma hdrstop

#include &quot;Test.h&quot;

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource &quot;*.dfm&quot;
TForm1 *Form1;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{

   cklasse = new c_Klasse();

   cklasse-&gt;macheWas();

   AnsiString asText = cklasse-&gt;m_pStringList-&gt;Text;

   delete cklasse;

   exit(0);

}
//---------------------------------------------------------------------------
</code></pre>
<p>Test.h:</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#ifndef TestH
#define TestH
//---------------------------------------------------------------------------
#include &lt;Classes.hpp&gt;
#include &lt;Controls.hpp&gt;
#include &lt;StdCtrls.hpp&gt;
#include &lt;Forms.hpp&gt;
#include &quot;Klasse.h&quot;
//------

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// Von der IDE verwaltete Komponenten
   TButton *Button1;
private:	// Anwender-Deklarationen
public:		// Anwender-Deklarationen
   __fastcall TForm1(TComponent* Owner);

   c_Klasse *cklasse;

};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
</code></pre>
<p>Klasse.cpp</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#pragma hdrstop

#include &quot;Klasse.h&quot;

//---------------------------------------------------------------------------

c_Klasse::c_Klasse()
{
   m_pSMTP = new TNMSMTP(Application);
   m_pStringList = new TStringList();

}

void c_Klasse::macheWas()
{
   m_pStringList-&gt;Add(&quot;Das ist ein Test&quot;);
   m_pStringList-&gt;Add(&quot;Ende.&quot;);
}

c_Klasse::~c_Klasse()
{
   delete m_pSMTP;
   delete m_pStringList;
}
</code></pre>
<p>Klasse.h:</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#include &lt;vcl.h&gt;
#include &quot;NMsmtp.hpp&quot;
#ifndef KlasseH
#define KlasseH

class c_Klasse
{
   private:

   TNMSMTP   *m_pSMTP;

   public:

   c_Klasse();
   ~c_Klasse();

   TStringList    *m_pStringList;

   void macheWas();

};
//---------------------------------------------------------------------------
#endif
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7971">@akari</a>:</p>
<blockquote>
<p>Denn dann kannst du std::auto_ptr verwenden...</p>
</blockquote>
<p>Was meinst du damit? Kannst du mal ein kleines Beispiel geben wie man das anwendet?</p>
<p>Wenn ich jetzt das Programm wie oben hätte, würden dann noch speicherlöcher entstehen?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1105870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1105870</guid><dc:creator><![CDATA[skluge]]></dc:creator><pubDate>Fri, 28 Jul 2006 07:42:10 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoren richtig einsetzen on Fri, 28 Jul 2006 07:53:52 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>dein neues Beispiel hat nun kein Speicherloch mehr, allerdings ist so natürlich die Membervariable sinnfrei, weil si ja nur lokal verwendet wird.</p>
<p>Das mit dem <a href="http://www.cppreference.com/cppmisc/auto_ptr.html" rel="nofollow">auto_ptr</a> sieht dann so aus:</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#include &lt;vcl.h&gt;
#pragma hdrstop

#include &quot;Test.h&quot;

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource &quot;*.dfm&quot;
TForm1 *Form1;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner), cklasse(new c_Klasse()) // Initialisierungsliste mit Ini. des  auto_ptr
{

   cklasse-&gt;macheWas();

   AnsiString asText = cklasse-&gt;m_pStringList-&gt;Text;

   exit(0);

}
//---------------------------------------------------------------------------
</code></pre>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#ifndef TestH
#define TestH
//---------------------------------------------------------------------------
#include &lt;Classes.hpp&gt;
#include &lt;Controls.hpp&gt;
#include &lt;StdCtrls.hpp&gt;
#include &lt;Forms.hpp&gt;
#include &lt;memory&gt; // Include für auto_ptr
#include &quot;Klasse.h&quot;
//------

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // Von der IDE verwaltete Komponenten
   TButton *Button1;
private:    // Anwender-Deklarationen
public:        // Anwender-Deklarationen
   __fastcall TForm1(TComponent* Owner);

   std::auto_ptr&lt;c_Klasse&gt; cklasse; // Deklaration des auto_ptr

};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
</code></pre>
<p>So kannst du 100% sicher sein, das mit dem Löschen jeder Instanz der Form (also auch beim Beenden des Programms) auch die jeweilige Instanz von c_KLasse gelöscht wird.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1105883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1105883</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 28 Jul 2006 07:53:52 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoren richtig einsetzen on Fri, 28 Jul 2006 08:05:40 GMT]]></title><description><![CDATA[<p>Noch was zu exit(). Bei Aufruf von exit wird das Programm beendet und es werden <strong>keine</strong> Destruktoren aufgerufen. Hier sollte eher Close() oder im Notfall Application-&gt;Terminate() verwendet werden.<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7971">@akari</a><br />
Das mit dem exit im Konstruktor meinst du doch hoffentlich nicht ernst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1105896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1105896</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 28 Jul 2006 08:05:40 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoren richtig einsetzen on Fri, 28 Jul 2006 08:11:08 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Das exit stammt aus dem Quellcode von skluge, da hab ich diesmal nicht aufgepasst <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>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1105904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1105904</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 28 Jul 2006 08:11:08 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoren richtig einsetzen on Fri, 28 Jul 2006 08:12:05 GMT]]></title><description><![CDATA[<p>Gut das werde ich dann mal ausprobieren!</p>
<p>Vielen Dank! <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/1105905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1105905</guid><dc:creator><![CDATA[skluge]]></dc:creator><pubDate>Fri, 28 Jul 2006 08:12:05 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoren richtig einsetzen on Fri, 28 Jul 2006 08:28:06 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7971">@akari</a>:</p>
<blockquote>
<p>So kannst du 100% sicher sein, das mit dem Löschen jeder Instanz der Form (also auch beim Beenden des Programms) auch die jeweilige Instanz von c_KLasse gelöscht wird.</p>
</blockquote>
<p>Nur damit ich jetzt richtig verstanden habe. Wenn ich z.B. das Programm durch<br />
&quot;Application-&gt;Terminate();&quot; beende, wird automatisch &quot;cklasse&quot; gelöscht und dessen Speicher wieder freigegeben?!<br />
Benötige ich dann noch einen Destruktor für c_Klasse, oder muss dieser nicht mehr definiert werden?<br />
Du hast ja gesagt, dass die Instanz &quot;cklasse&quot; durch das Beenden des Programms auch gelöscht wird (wenn ich das jetzt richtig verstanden habe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> ), muss ich dann kein <strong>delete</strong> explizit angeben?</p>
<p>So wie ich das jetzt verstanden habe, braucht man sich um die Speicheraufhebung jetzt keine Gedanken mehr zu machen, wenn man diesen auto_ptr benutzt. DAs Programm sorgt doch jetzt dafür, dass alle Instanzen und dessen Speicher wieder freigegeben werden (zusätzlich der Speicher, der durch mögliche komponentenreservierungen im konstruktor der jeweiligen Instanz), oder?</p>
<p>Nochmals danke für die Antwort!</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1105924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1105924</guid><dc:creator><![CDATA[skluge]]></dc:creator><pubDate>Fri, 28 Jul 2006 08:28:06 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoren richtig einsetzen on Fri, 28 Jul 2006 08:38:00 GMT]]></title><description><![CDATA[<p>Instanzen von autp_ptr werden gelöscht, wenn sie den Gültigkeitsbereich verlassen. Also wennn sie lokal in einer Funktion sind, wenn die Funktion verlassen wird. Wenn sie Member einer Klasse sind, wenn der Destruktor dieser Klasse aufgerufen wird.<br />
Du mußt für deine eigene Klasse nur dann einen Destruktor erzeugen wenn du nichttriviele Member in deiner Klasse hast. Das wären z.Bsp. Pointer, denen du mit new Speicher zugewiesen hast. Wenn alle deine Variablen einfache Typen (PODs) oder Klassen mit eigenen Destruktor (AnsiString o.ä.) sind und keine weiteren Aufräumarbeiten stattfinden müssen, reicht auch der standardmäßig erzeugte Destruktor.<br />
Vor Verwendung von auto_ptr lies dir gründlich ein Tutorial dazu durch. auto_ptr hat mehrere Tücken (insbesondere Besitzübertragung). Der Name Autopointer impliziert mehr als er wirklich kann. Ich persönlich bevorzuge die boost Smartpointer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1105934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1105934</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 28 Jul 2006 08:38:00 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoren richtig einsetzen on Fri, 28 Jul 2006 08:40:36 GMT]]></title><description><![CDATA[<p>Hallo</p>
<blockquote>
<p>Nur damit ich jetzt richtig verstanden habe. Wenn ich z.B. das Programm durch<br />
&quot;Application-&gt;Terminate();&quot; beende, wird automatisch &quot;cklasse&quot; gelöscht und dessen Speicher wieder freigegeben?!</p>
</blockquote>
<p>In meinem Beispiel ja. Und zwar weil dann die Instanz des Formes gelöscht wird, und damit über den auto_ptr auch die c_Klasse-Instanz.<br />
Achtung : das Form wird gelöscht, weil es so erstellt wird das es in dem Application-Objekt registriert ist. Man kann auch Form-Instanzen dynamisch erstellen, und diese nicht bei App. registrieren (<em>new TForm1(0);</em> ).<br />
In diesem Fall wird diese Instanz <strong>nicht</strong> automatisch mit Programmende gelöscht, und damit auch nicht der auto_ptr ausgelöst.</p>
<blockquote>
<p>Benötige ich dann noch einen Destruktor für c_Klasse, oder muss dieser nicht mehr definiert werden?</p>
</blockquote>
<p>Ob du für c_Klasse einen Destruktor brauchst oder nicht hat nichts mit auto_ptr oder der Lebenszeit zu tun. Sondern nur ob c_Klasse selber Speicher allokiert hat (in deinem Fall <em>m_pSMTP</em>, <em>m_pStringList</em>). Dieser muß wieder freigegebene werden, gleichgültig in welchem Zustand die Instanzen sind.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1105938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1105938</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 28 Jul 2006 08:40:36 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktoren richtig einsetzen on Fri, 28 Jul 2006 09:09:40 GMT]]></title><description><![CDATA[<p>Kleine Frage am Rande dazu.<br />
Wenn ich z.B folgendes Objekt erzeuge:</p>
<pre><code class="language-cpp">m_pPlaintext = new TIdText(m_pMessage-&gt;MessageParts,m_pStringListHTML);
   m_pPlaintext-&gt;ContentType=&quot;text/plain&quot;;
</code></pre>
<p>kommt beim &quot;delete m_pPlaintext&quot; ein Fehler!</p>
<blockquote>
<p>m Projekt Projektname sind zu viele aufeinanderfolgende Exceptions aufgetreten: Anwendungsdefinierte Exception (Code xxxx) bei xxxx. Prozeß wurde angehalten. Fortsetzen mit Einzelne Anweisung oder Start.</p>
</blockquote>
<p>Woran kann das denn liegen? Weiß jemand eine Lösung</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1105962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1105962</guid><dc:creator><![CDATA[skluge]]></dc:creator><pubDate>Fri, 28 Jul 2006 09:09:40 GMT</pubDate></item></channel></rss>