<?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 automatisch nach Konstruktor]]></title><description><![CDATA[<p>Hallo zusammen!<br />
Ich habe ein Problem bei einer Klasse. Da der Code sehr lang und unüberschaubar ist, werde ich mit Pseudo-Code das Problem darstellen.</p>
<pre><code class="language-cpp">class Klasse
{
    Klasse() {};
    Klasse(int test);
    ~Klasse() { Clean(); };

    Create(int test) { Klasse(test); }:
    Clean();

    int Use() {return test;};
}
</code></pre>
<p>Nun erfolgt dieser Aufruf:</p>
<pre><code class="language-cpp">Klasse test;  //Standard-Konstruktor
test.Create(15);    //Klassenvariable erzeugt
test.Use();    //Hier wird auf Klassenvariable zugegriffen
</code></pre>
<p>Im Konstruktor wird eine bestimmte Klassenvariable initialisiert. Diese wird dann auch im Destruktor bzw in Clean() wieder gelöscht.<br />
Das Problem hierbei ist, dass, wenn ich im Debugger die Ausführung verfolge, dass nach der 2ten Zeile (test.Create(int)), in der der Konstruktor (manuell) aufgerufen wird, danach der Destruktor aufgerufen wird und mir die soeben initialisierte Klassenvariable wieder löscht. Daher bekomme ich dann beim Zugriff darauf Fehlermeldungen.</p>
<p>Wie kommt dieses Verhalten zustande und was kann ich dagegen tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/282011/destruktor-automatisch-nach-konstruktor</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 11:23:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/282011.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 12 Feb 2011 00:40:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Destruktor automatisch nach Konstruktor on Sat, 12 Feb 2011 00:40:37 GMT]]></title><description><![CDATA[<p>Hallo zusammen!<br />
Ich habe ein Problem bei einer Klasse. Da der Code sehr lang und unüberschaubar ist, werde ich mit Pseudo-Code das Problem darstellen.</p>
<pre><code class="language-cpp">class Klasse
{
    Klasse() {};
    Klasse(int test);
    ~Klasse() { Clean(); };

    Create(int test) { Klasse(test); }:
    Clean();

    int Use() {return test;};
}
</code></pre>
<p>Nun erfolgt dieser Aufruf:</p>
<pre><code class="language-cpp">Klasse test;  //Standard-Konstruktor
test.Create(15);    //Klassenvariable erzeugt
test.Use();    //Hier wird auf Klassenvariable zugegriffen
</code></pre>
<p>Im Konstruktor wird eine bestimmte Klassenvariable initialisiert. Diese wird dann auch im Destruktor bzw in Clean() wieder gelöscht.<br />
Das Problem hierbei ist, dass, wenn ich im Debugger die Ausführung verfolge, dass nach der 2ten Zeile (test.Create(int)), in der der Konstruktor (manuell) aufgerufen wird, danach der Destruktor aufgerufen wird und mir die soeben initialisierte Klassenvariable wieder löscht. Daher bekomme ich dann beim Zugriff darauf Fehlermeldungen.</p>
<p>Wie kommt dieses Verhalten zustande und was kann ich dagegen tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019929</guid><dc:creator><![CDATA[doubleNULL]]></dc:creator><pubDate>Sat, 12 Feb 2011 00:40:37 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor automatisch nach Konstruktor on Sat, 12 Feb 2011 00:48:09 GMT]]></title><description><![CDATA[<p>Das Verhalten ist doch genau das was du da machst: In create wird ein neues, namenloses Klassenobjekt angelegt und beim Verlassen der Funktion wieder zerstört wie es auch sein muss. Dein use funktioniert nicht, weil deine Klasse gar kein Member namens test hat.</p>
<p>Da das ganze aber überhaupt keinen Sinn macht, nehme ich mal an, dass dies nicht das ist was du wolltest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019932</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 12 Feb 2011 00:48:09 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor automatisch nach Konstruktor on Sat, 12 Feb 2011 00:53:56 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Das Verhalten ist doch genau das was du da machst: <strong>In create wird ein neues, namenloses Klassenobjekt angelegt</strong> und beim Verlassen der Funktion wieder zerstört wie es auch sein muss. Dein use funktioniert nicht, weil deine Klasse gar kein Member namens test hat.</p>
<p>Da das ganze aber überhaupt keinen Sinn macht, nehme ich mal an, dass dies nicht das ist was du wolltest.</p>
</blockquote>
<p>Der Sinn hinter dem <strong>markierten</strong> ist aber, den Konstruktor aufzurufen. Kann ich denn überhaupt den Konstruktor aus einer Methode aufrufen??</p>
<p>Hintergrund: Diese Klasse soll später auch z.b. durch ein Array korrekt initialisiert werden können. Da man bei Arrays aber nur den Standard-Konstruktor hat (der aufgerufen wird), muss für alle Elemente die Create()-Funktion aufgerufen werden. Und eben diese funktioniert hier nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019934</guid><dc:creator><![CDATA[doubleNULL]]></dc:creator><pubDate>Sat, 12 Feb 2011 00:53:56 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor automatisch nach Konstruktor on Sat, 12 Feb 2011 01:27:25 GMT]]></title><description><![CDATA[<p>Du kannst ein Objekt das schon konstruiert ist nicht einfach nochmal konstruieren.<br />
Verwende den Zuweisungsoperator dafür:</p>
<pre><code class="language-cpp">class Klasse
{
public:
    Klasse() : m_test(0) {};
    Klasse(int test) : m_test(test) {};

    int Use() {return m_test;}

private:
    int m_test;
};

int main()
{
   Klasse k;
   k = Klasse(123);
   std::cout &lt;&lt; k.Use() &lt;&lt; std::endl;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2019942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019942</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 12 Feb 2011 01:27:25 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor automatisch nach Konstruktor on Sat, 12 Feb 2011 02:04:51 GMT]]></title><description><![CDATA[<p>Hierbei habe ich wieder das Problem, dass der Destruktor aufgerufen wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> :</p>
<pre><code class="language-cpp">int main()
{
   Klasse k;
   k = Klasse(123);  //Aufruf Kontruktor, Aufruf Destruktor
   std::cout &lt;&lt; k.Use() &lt;&lt; std::endl;  //Zugriffsfehler
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2019950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019950</guid><dc:creator><![CDATA[doubleNULL]]></dc:creator><pubDate>Sat, 12 Feb 2011 02:04:51 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor automatisch nach Konstruktor on Sat, 12 Feb 2011 02:53:54 GMT]]></title><description><![CDATA[<p>Dass der Destruktor hier aufgerufen wird ist normal und richtig.</p>
<p>doubleNULL schrieb:</p>
<blockquote>
<pre><code class="language-cpp">int main()
{
   Klasse k;
   k = Klasse(123);  //Aufruf Kontruktor, Aufruf Destruktor
   std::cout &lt;&lt; k.Use() &lt;&lt; std::endl;  //Zugriffsfehler
}
</code></pre>
</blockquote>
<p>Der &quot;Zugriffsfehler&quot; kommt vermutlich einfach daher, dass du deiner Klasse keinen passenden Copy-Konstruktor und Assignment-Operator verpasst hast.<br />
Bei einer Klasse die einfach nur ein Integer als Member hat, ist das auch nicht nötig. Wenn die Klasse aber &quot;manuell&quot; irgendwelche Resourcen kontrolliert, dann musst du das machen.</p>
<p>Also wenn du ein &quot;new&quot; im Konstruktor hast, dann brauchst du auch ein &quot;delete&quot; im Destruktor, und musst normalerweise auch den Copy-Konstruktor und Assignment-Operator selbst implementieren.</p>
<p><a href="http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)" rel="nofollow">http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)</a></p>
<p>Ich glaube aber dass dir einfach einige C++ Grundlagen fehlen, wie z.B. was Objekte in C++ überhaupt sind, wie sich diese verhalten, welche Rolle Konstruktor und Destruktor bei der Erzeugung/Zerstörung von Objekten spielen etc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2019954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2019954</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 12 Feb 2011 02:53:54 GMT</pubDate></item><item><title><![CDATA[Reply to Destruktor automatisch nach Konstruktor on Sat, 12 Feb 2011 13:59:24 GMT]]></title><description><![CDATA[<p>Ok, danke für den Link! Das Problem bestand darin, dass ich versucht habe, einen Zeiger zu kopieren, der auf eine &quot;leere&quot; Speicherstelle zeigte <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="🙄"
    /><br />
Ich danke allen für ihre Bereitschaft!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2020063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2020063</guid><dc:creator><![CDATA[doubleNULL]]></dc:creator><pubDate>Sat, 12 Feb 2011 13:59:24 GMT</pubDate></item></channel></rss>