<?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[Frage zu Destructor]]></title><description><![CDATA[<p>Liebe Leser</p>
<p>Ich lese aktuell das Buch von Breyman über C++11 und habe eine Frage zu Destruktoren</p>
<p>Hier die Beispiel klasse. Frage steht unten</p>
<pre><code>class EIN_SINNLOSES_OBJEKT
{
private:
   int    int1;
   int    int2;
   int    *PointerToInt;

public:

EIN_SINNLOSES_OBJEKT() = default;   // Optimal :: Compiler erstellt konstruktor
~EIN_SINNLOSES_OBJEKT() = default;  // Optimal :: Compiler erstellt Destruktor
}
</code></pre>
<p>hier die main funktion</p>
<pre><code>int main
{ 
EIN_SINNLOSES_OBJEKT  *Obj;  // Konstruktor wir aufgerufen
Obj.int1 = 4;
Obj.int2 = 49;
Obj.PointerToInt = &amp;Obj.int1; // PointerToInt  zeigt auf speicher von int1

} // Destruktor wird aufgerufen
</code></pre>
<p>So nun zu meiner Frage.</p>
<p>Wenn der Destruktor aufgerufen wird, werden ja automtisch alle Objekte in der Klasse zerstört/Gelöscht, wiel dieser vom Compiler generiert wird. Jedoch wie<br />
funktioniert das beim member &quot;PointerToInt&quot;? Wird nur der Zeiger gelöscht oder auch der Inhalt, worauf er zeit (Speicherfreigabe)?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327682/frage-zu-destructor</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 15:34:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327682.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 27 Aug 2014 11:00:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Destructor on Wed, 27 Aug 2014 11:01:39 GMT]]></title><description><![CDATA[<p>Liebe Leser</p>
<p>Ich lese aktuell das Buch von Breyman über C++11 und habe eine Frage zu Destruktoren</p>
<p>Hier die Beispiel klasse. Frage steht unten</p>
<pre><code>class EIN_SINNLOSES_OBJEKT
{
private:
   int    int1;
   int    int2;
   int    *PointerToInt;

public:

EIN_SINNLOSES_OBJEKT() = default;   // Optimal :: Compiler erstellt konstruktor
~EIN_SINNLOSES_OBJEKT() = default;  // Optimal :: Compiler erstellt Destruktor
}
</code></pre>
<p>hier die main funktion</p>
<pre><code>int main
{ 
EIN_SINNLOSES_OBJEKT  *Obj;  // Konstruktor wir aufgerufen
Obj.int1 = 4;
Obj.int2 = 49;
Obj.PointerToInt = &amp;Obj.int1; // PointerToInt  zeigt auf speicher von int1

} // Destruktor wird aufgerufen
</code></pre>
<p>So nun zu meiner Frage.</p>
<p>Wenn der Destruktor aufgerufen wird, werden ja automtisch alle Objekte in der Klasse zerstört/Gelöscht, wiel dieser vom Compiler generiert wird. Jedoch wie<br />
funktioniert das beim member &quot;PointerToInt&quot;? Wird nur der Zeiger gelöscht oder auch der Inhalt, worauf er zeit (Speicherfreigabe)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415083</guid><dc:creator><![CDATA[Sebastian Müller]]></dc:creator><pubDate>Wed, 27 Aug 2014 11:01:39 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Destructor on Wed, 27 Aug 2014 11:14:17 GMT]]></title><description><![CDATA[<p>Sebastian Müller schrieb:</p>
<blockquote>
<p>Wenn der Destruktor aufgerufen wird, werden ja automtisch alle Objekte in der Klasse zerstört/Gelöscht, wiel dieser vom Compiler generiert wird.</p>
</blockquote>
<p>Nein. Wenn der Destruktor aufgerufen wird, also pro Aufruf, wird immer nur ein Objekt zerstört. Der Compiler sorgt aber dafür dass an allen Stellen wo Objekte mit &quot;automatic storage duration&quot; &quot;out of scope&quot; gehen, die passenden Destruktoren aufgerufen werden.</p>
<p>Sebastian Müller schrieb:</p>
<blockquote>
<p>Jedoch wie funktioniert das beim member &quot;PointerToInt&quot;? Wird nur der Zeiger gelöscht oder auch der Inhalt, worauf er zeit (Speicherfreigabe)?</p>
</blockquote>
<p>Es wird natürlich nur der Zeiger gelöscht, das Objekt auf der er zeigt bleibt bestehen.</p>
<p>Überleg dir einfach was es für Konsequenzen hätte wenn es anders wäre, dann wird dir klar werden dass es eben nicht anders sein kann <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>ps: Der Code in deinem Beispiel ist falsch. &quot;Obj&quot; ist ein Zeiger, und Zeiger kann man nicht mit &quot;.&quot; dereferenzieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415084</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 27 Aug 2014 11:14:17 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Destructor on Wed, 27 Aug 2014 11:21:37 GMT]]></title><description><![CDATA[<p>Lass mich das mal korrigieren:</p>
<pre><code>int main 
{ 
EIN_SINNLOSES_OBJEKT  *Obj;  // Pointer auf EIN_SINNLOSES_OBJEKT. Ein Objekt wir erstellt, also wird auch kein Konstruktor
Obj.int1 = 4;  //Du hast einen Pointer. Zugriff nur über &quot;-&gt;&quot; nicht &quot;.&quot;
Obj.int2 = 49; //Hier auch. Außerdem sind die member privat, das geht also doppelt nicht.
Obj.PointerToInt = &amp;Obj.int1; // PointerToInt  zeigt auf speicher von int1 

} // Destruktor wird aufgerufen
</code></pre>
<p>Wenn man das so macht passt es wieder:</p>
<pre><code>class EIN_SINNLOSES_OBJEKT
/* ... */ //Member public gemacht

int main
{ 
EIN_SINNLOSES_OBJEKT Obj;  // Konstruktor wird aufgerufen
Obj.int1 = 4;
Obj.int2 = 49;
Obj.PointerToInt = Obj.int1; // PointerToInt  zeigt auf speicher von int1
} // Destruktor wird aufgerufen
</code></pre>
<p>Zu deiner eigentlichen Frage:<br />
Der Destructor zerstört das Object. Da &quot;int1&quot;, &quot;int2&quot;, und &quot;PointerToInt&quot; Member des Objekts sind, wird auch dieser Speicher freigegeben. Der Speicher auf den der Pointer zeigt allerdings nicht, er könnte ja noch an anderer Stelle gebraucht werden.<br />
Da der Pointer auf einen Member des selben Objekts zeigt ist das hier kein Problem. Wenn es auf etwas anderes zeigen würde, z.B. auf einen mit new angeforderten Speicherbereich, müsstest du diesen auch manuell im Destruktor freigeben.<br />
Zu jedem new gehört ein delete. Wenn du allerdings nicht über new Speicher anforderst musst du auch nichts freigeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415085</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415085</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Wed, 27 Aug 2014 11:21:37 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Destructor on Wed, 27 Aug 2014 11:48:30 GMT]]></title><description><![CDATA[<p>OK, dann wäre meine Frage ja beantwortet. Danke</p>
<p>Jedoch eine Sache noch</p>
<p>&quot;Nein. Wenn der Destruktor aufgerufen wird, also pro Aufruf, wird immer nur ein Objekt zerstört. Der Compiler sorgt aber dafür dass an allen Stellen wo Objekte mit &quot;automatic storage duration&quot; &quot;out of scope&quot; gehen, die passenden Destruktoren aufgerufen werden. &quot;</p>
<p>Deine Aussage wieder spricht Irgendwie der, die in meinem Buch steht.</p>
<p>Wird der Destruktor (der vom Compiler) als 3 mal aufgerufen?<br />
für int1 / in2 / PointerToInt. oder wie meinst du das</p>
<p>DarkShadow44********************+++<br />
Die Main Funktion und die Klasse sind in derselben Datei, und daher bekannt. Die Vorwärtsdeklaration hatte ich jedoch vergessen. und das = new OBJ. Jedoch warum fehlt der Adress operator (&amp;) vor Obj.int1. man weist einem Zeiger eine Adresse zu. oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415088</guid><dc:creator><![CDATA[Sebastian Müller]]></dc:creator><pubDate>Wed, 27 Aug 2014 11:48:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Destructor on Wed, 27 Aug 2014 11:56:44 GMT]]></title><description><![CDATA[<p>wenn du das Objekt tatsächlich mit &quot;new&quot; erstellst, wird am Ende des Scopes *kein* Destruktor aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415089</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Wed, 27 Aug 2014 11:56:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Destructor on Wed, 27 Aug 2014 12:07:05 GMT]]></title><description><![CDATA[<p>Eingebaute Typen (wie alle Integer-Typen, Zeiger etc.) haben keine Destruktoren, von daher werden die auch nicht aufgerufen.</p>
<p>(Wobei man auch sagen könnte: sie haben schon einen Destruktor, der aber genau *nichts* tut. Die Unterscheidung ist meist nicht wichtig. Laut Standard ist es aber IIRC so dass die erwähnten Typen keinen Destruktor haben. @Arcoth/camper/...: Bitte um Korrektur falls das Blödsinn ist ;))</p>
<p>In folgendem Beispiel</p>
<pre><code class="language-cpp">struct Foo
{
    ~Foo()
    {
        // Dinge tun
    } // ***
    std::string a;
    std::string b;
    std::string* pc;
};

int main()
{
   Foo f;
} // &lt;------
</code></pre>
<p>Wird beim Pfeili f.~Foo() aufgerufen, also der Destruktor von Foo auf das Objekt f.<br />
Das ist alles.</p>
<p>Der Destruktor ~Foo ruft dann wiederrum den std::string Destruktor für seine Member a und b auf, ganz normal als Unterfunktion. Automatisch von Compiler eingefügt, nachdem der ganze Code den man selbst in ~Foo reingeschrieben hat ausgeführt wurde (Stelle &quot;***&quot;).</p>
<p>pc hat wie schon erwähnt keinen Destruktor, also wird da auch nixe aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415091</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 27 Aug 2014 12:07:05 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Destructor on Wed, 27 Aug 2014 12:25:13 GMT]]></title><description><![CDATA[<p>Sebastian Müller schrieb:</p>
<blockquote>
<p>&quot;Nein. Wenn der Destruktor aufgerufen wird, also pro Aufruf, wird immer nur ein Objekt zerstört. Der Compiler sorgt aber dafür dass an allen Stellen wo Objekte mit &quot;automatic storage duration&quot; &quot;out of scope&quot; gehen, die passenden Destruktoren aufgerufen werden. &quot;</p>
<p>Deine Aussage wieder spricht Irgendwie der, die in meinem Buch steht.</p>
<p>Wird der Destruktor (der vom Compiler) als 3 mal aufgerufen?<br />
für int1 / in2 / PointerToInt. oder wie meinst du das</p>
</blockquote>
<p>Dann steht entweder in deinem Buch Mist, oder du hast das falsch verstanden. Wenn ein Objekt zerstört wird, werden alle Member auch zertört. Bei Integern braucht man aber ja aber keinen Destruktor, und bei Zeigern gibts das auch nicht. Außer bei Smartpointern. Aber das sind ja auch wieder Objekte und keine eingebauten Typen. <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>Sebastian Müller schrieb:</p>
<blockquote>
<p>Die Main Funktion und die Klasse sind in derselben Datei, und daher bekannt. Die Vorwärtsdeklaration hatte ich jedoch vergessen. und das = new OBJ. Jedoch warum fehlt der Adress operator (&amp;) vor Obj.int1. man weist einem Zeiger eine Adresse zu. oder?</p>
</blockquote>
<p>Wie meinst du ?<br />
Ändert doch nichts dran dass du einen Pointer hast und mit &quot;.&quot; drauf zugreifst.<br />
Das mit dem Adress operator, der ist irgendwie beim C&amp;P verloren gegangen, der darf natürlich nicht fehlen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2415093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2415093</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Wed, 27 Aug 2014 12:25:13 GMT</pubDate></item></channel></rss>