<?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[Speicherproblem im Destruktor]]></title><description><![CDATA[<p>Hallo!</p>
<p>Nachdem ich jetzt den ganzen Nachmittag damit verbracht habe den Fehler im meinem Programm zu suchen habe ich jetzt festgestellt, dass das Problem doch nichts mit Bibliotheken zu tun hat, wie ich das in meinem zuvor erstellten Thread behauptet habe.</p>
<p>Also: ich habe zum Testen diesen Code geschrieben:</p>
<pre><code class="language-cpp">class String{
private:
    char* c;
public:
    String(){
        c = new char[100];
    }

    ~String(){
        delete []c;
    }
};

void setString(String s){
}

int main(int argc, char* argv[]){
    setString(String());
    return 0;
}
</code></pre>
<p>Unerklärlicherweise wird der Destruktor ~String() 2 Mal ausgeführt: ein mal am Ende von setString und ein Mal am Ende von main. Das bedeutet natürlich ein Problem. Klar könnte ich verhindern dass c 2 Mal gelöscht wird, aber ich wüsste gerne warum der Destruktor 2 Mal läuft: es wird doch nur 1 Objekt erzeugt.</p>
<p>Das Witzige ist: wenn ich einen Copy-Constructor für String einfüge funktioniert es. An dieser Stelle würden die meisten wahrscheinlich sagen: klar, String() erzeugt ein Objekt, das für den Aufruf von setString kopiert wird. Und da der Default-Copy-Constructor eine flache Kopie macht ist das Ergebnis logisch. Aber jetzt kommt es: der Copy-Constructor (wenn ich einen einfüge) wird nie ausgeführt! Der normale Constructor und der Copy-Constructor laufen in Summe genau 1 Mal. Es wird also tatsächlich nur 1 Objekt erzeugt. Wieso läuft dann der Destruktor 2 Mal?? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Und das beste ist: das ganze passiert nur wenn ich den VC++-Compiler verwende (wobei ich mit Visual Studio eine normale Win32-Konsolenapplikation erstellt habe). Bei Verwendung von gcc unter Linux und MacOS X sowie Turbo C unter Windows wird der Destruktor überall nur 1 Mal ausgeführt! Ich kann mir nicht vorstellen dass das ein Fehler im MS-Compiler ist, eher eine Einstellung. Denn so einen Code schreibt doch bald einmal wer...</p>
<p>Weiß jemand was laut Standard passieren sollte? Und sollte der Copy-Constructor laufen?</p>
<p>Danke im Voraus!</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/136392/speicherproblem-im-destruktor</link><generator>RSS for Node</generator><lastBuildDate>Mon, 08 Jun 2026 04:44:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/136392.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 Feb 2006 17:41:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherproblem im Destruktor on Thu, 09 Feb 2006 17:41:02 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Nachdem ich jetzt den ganzen Nachmittag damit verbracht habe den Fehler im meinem Programm zu suchen habe ich jetzt festgestellt, dass das Problem doch nichts mit Bibliotheken zu tun hat, wie ich das in meinem zuvor erstellten Thread behauptet habe.</p>
<p>Also: ich habe zum Testen diesen Code geschrieben:</p>
<pre><code class="language-cpp">class String{
private:
    char* c;
public:
    String(){
        c = new char[100];
    }

    ~String(){
        delete []c;
    }
};

void setString(String s){
}

int main(int argc, char* argv[]){
    setString(String());
    return 0;
}
</code></pre>
<p>Unerklärlicherweise wird der Destruktor ~String() 2 Mal ausgeführt: ein mal am Ende von setString und ein Mal am Ende von main. Das bedeutet natürlich ein Problem. Klar könnte ich verhindern dass c 2 Mal gelöscht wird, aber ich wüsste gerne warum der Destruktor 2 Mal läuft: es wird doch nur 1 Objekt erzeugt.</p>
<p>Das Witzige ist: wenn ich einen Copy-Constructor für String einfüge funktioniert es. An dieser Stelle würden die meisten wahrscheinlich sagen: klar, String() erzeugt ein Objekt, das für den Aufruf von setString kopiert wird. Und da der Default-Copy-Constructor eine flache Kopie macht ist das Ergebnis logisch. Aber jetzt kommt es: der Copy-Constructor (wenn ich einen einfüge) wird nie ausgeführt! Der normale Constructor und der Copy-Constructor laufen in Summe genau 1 Mal. Es wird also tatsächlich nur 1 Objekt erzeugt. Wieso läuft dann der Destruktor 2 Mal?? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Und das beste ist: das ganze passiert nur wenn ich den VC++-Compiler verwende (wobei ich mit Visual Studio eine normale Win32-Konsolenapplikation erstellt habe). Bei Verwendung von gcc unter Linux und MacOS X sowie Turbo C unter Windows wird der Destruktor überall nur 1 Mal ausgeführt! Ich kann mir nicht vorstellen dass das ein Fehler im MS-Compiler ist, eher eine Einstellung. Denn so einen Code schreibt doch bald einmal wer...</p>
<p>Weiß jemand was laut Standard passieren sollte? Und sollte der Copy-Constructor laufen?</p>
<p>Danke im Voraus!</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990288</guid><dc:creator><![CDATA[ChrisR]]></dc:creator><pubDate>Thu, 09 Feb 2006 17:41:02 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem im Destruktor on Thu, 09 Feb 2006 18:11:07 GMT]]></title><description><![CDATA[<p>Ich hab ezwar ehrlichgesagt keine Ahnung, warum der Destruktor zweimal aufgerufen wird.</p>
<p>Das kann dir aber auch egal sein, sofern du nach dem delete Aufruf deinen Zeiger auf 0 setzt. Dann gibt es keinerlei Programmabstürze oder ähnliches.<br />
Eine Speicherlücke entsteht dann auch nicht, weil der Speicher vorher ja ordnungsgemäß gelöscht wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990311</guid><dc:creator><![CDATA[SALOMON]]></dc:creator><pubDate>Thu, 09 Feb 2006 18:11:07 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem im Destruktor on Thu, 09 Feb 2006 18:17:19 GMT]]></title><description><![CDATA[<p>Es werden zwei Objekte erstellt und, dass der Kopierkonstruktor nicht aufgerufen wird glaube ich nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990318</guid><dc:creator><![CDATA[Apollon]]></dc:creator><pubDate>Thu, 09 Feb 2006 18:17:19 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem im Destruktor on Thu, 09 Feb 2006 18:23:04 GMT]]></title><description><![CDATA[<p>Könnte jemand bitte den obigen Code testen und berichten ob der gleiche Fehler auftritt? Vielleicht liegt es ja doch an irgend einer Einstellung im Visual Studio.</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990322</guid><dc:creator><![CDATA[ChrisR]]></dc:creator><pubDate>Thu, 09 Feb 2006 18:23:04 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem im Destruktor on Thu, 09 Feb 2006 18:23:29 GMT]]></title><description><![CDATA[<p>ChrisR schrieb:</p>
<blockquote>
<p>der Copy-Constructor (wenn ich einen einfüge) wird nie ausgeführt!</p>
</blockquote>
<p>Kannst du den Kopierkonstruktor mal posten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990324</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 09 Feb 2006 18:23:29 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem im Destruktor on Thu, 09 Feb 2006 18:39:18 GMT]]></title><description><![CDATA[<p>bei mir wird der destruktor auch 2 mal aufgerufen<br />
und es kommt zum absturz....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990350</guid><dc:creator><![CDATA[golden_jubilee]]></dc:creator><pubDate>Thu, 09 Feb 2006 18:39:18 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem im Destruktor on Thu, 09 Feb 2006 19:02:27 GMT]]></title><description><![CDATA[<p>Copy-Constructor:</p>
<pre><code class="language-cpp">String(const String&amp; s){
}
</code></pre>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990368</guid><dc:creator><![CDATA[ChrisR]]></dc:creator><pubDate>Thu, 09 Feb 2006 19:02:27 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem im Destruktor on Thu, 09 Feb 2006 19:12:29 GMT]]></title><description><![CDATA[<p>Vllt. solltest du den eher so schreiben (jetzt kopiert er den char-Vektor jedesmal):</p>
<pre><code class="language-cpp">#include &lt;cstring&gt;

class String{
  //...
  const char* raw() const {
    return c;
  }
public:
  //...
  String(const String &amp;s){
    c = new char[100];
    const char *str = s.raw();
    int len = std::strlen(str);
    std::strncpy(c, str, len);
  }
};
</code></pre>
<p>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990383</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Thu, 09 Feb 2006 19:12:29 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem im Destruktor on Thu, 09 Feb 2006 19:19:04 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>Vllt. solltest du den eher so schreiben</p>
</blockquote>
<p>Dass meine Variante keinen Sinn macht ist mir klar. Aber nachdem er sowieso nie ausgeführt wird (habe durchdebuggt und eine Testausgabe gemacht) spielt das bei diesem Beispiel keine Rolle. Die Frage ist vielmehr wieso sich die Existenz des Copy-Constructors darauf auswirkt wie oft der Destruktor ausgeführt wird.</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990394</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990394</guid><dc:creator><![CDATA[ChrisR]]></dc:creator><pubDate>Thu, 09 Feb 2006 19:19:04 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem im Destruktor on Thu, 09 Feb 2006 19:20:50 GMT]]></title><description><![CDATA[<p>steff3 schrieb:</p>
<blockquote>
<p>bei mir wird der destruktor auch 2 mal aufgerufen<br />
und es kommt zum absturz....</p>
</blockquote>
<p>Einmal wird das String() Objekt in main() zerstört und einmal das Objekt von SetString(String s)</p>
<p>Der Fehler ist, dass 2 Objekte bestehen und beide den selben Speicher zulöschen versuchen. Du musst den char* im Copy-Ctor und bei op= kopieren..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990398</guid><dc:creator><![CDATA[Konrad]]></dc:creator><pubDate>Thu, 09 Feb 2006 19:20:50 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem im Destruktor on Thu, 09 Feb 2006 20:04:38 GMT]]></title><description><![CDATA[<p>[quote=&quot;Konrad&quot;]</p>
<p>steff3 schrieb:</p>
<blockquote>
<p>Der Fehler ist, dass 2 Objekte bestehen und beide den selben Speicher zulöschen versuchen. Du musst den char* im Copy-Ctor und bei op= kopieren..</p>
</blockquote>
<p>Das wäre auch meine erste Idee gewesen. Tatsache ist aber, dass der Copy-Construktor (selbst wenn ich ihn implementiere) nie aufgerufen wird (das hat mit der Debugger und eine Testausgabe bestätigt). Daher kann es keine Rolle spielen was darin gemacht wird.</p>
<p>Warum der Copy-Construktor nie aufgerufen wird weiß ich auch nicht sicher. Meine Vermutung ist, dass das Objekt nicht zuerst erstellt und dann kopiert wird, sondern gleich von Anfang an am Stack der aufgerufenen Funktion erzeugt wird (wahrscheinlich eine Optimierung wenn man das String() direkt in den Aufruf schreibt). Jedoch dürfte dann der Destruktor nur 1 Mal laufen.</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990456</guid><dc:creator><![CDATA[ChrisR]]></dc:creator><pubDate>Thu, 09 Feb 2006 20:04:38 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem im Destruktor on Thu, 09 Feb 2006 20:16:34 GMT]]></title><description><![CDATA[<p>Es werden zwei Objekte erzeugt, einmal auf dem Stack von setString und einmal in main. Das heisst es wird zweimal ein Constructor und zweimal der Destructor aufgerufen. Ich schreibe &quot;ein Constructor&quot;, weil das entweder zweimal der Default Constructor oder einer davon der Default Construktor und der andere der Copy Constructor sein muss.</p>
<p>Alles andere wäre eine grobe Panne in der Implementierung der Sprache <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>EDIT:</p>
<p>Ich muss mich selbst korrigieren, der folgende Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class String {
private:
  char* c;
public:
  String()
  {
    cout &lt;&lt; &quot;ctor&quot; &lt;&lt; endl;
    c = new char[100];
  }
  String(const String&amp; o)
  {
    cout &lt;&lt; &quot;copy ctor&quot; &lt;&lt; endl;
  }
  String&amp; operator=(const String&amp; o)
  {
    cout &lt;&lt; &quot;op=&quot; &lt;&lt; endl;
  }
  ~String()
  {
    cout &lt;&lt; &quot;dtor&quot; &lt;&lt; endl;
    delete[] c;
  }
};

void setString(String s)
{
}

int main(void)
{
  setString(String());
  return 0;
}
</code></pre>
<p>wird von meinem g++ soweit herunteroptimiert, dass tatsächlich nur einmal der Constructor durchlaufen wird. Allerdings gilt dasselbe für den Destructor, insofern könnte es sich bei Dir tatsächlich um eine Macke im Compiler handeln.</p>
<p>Wenn ich mit String s; setString(s); ein Objekt erzeuge und übergebe wird korrekterweise Ctor, Copy Ctor, Dtor, Dtor ausgegeben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990462</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 09 Feb 2006 20:16:34 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem im Destruktor on Thu, 09 Feb 2006 20:15:46 GMT]]></title><description><![CDATA[<p>So muesste es sein. Ist aber offensichtlich nicht der Fall. Bei mir (gcc) wird auch nicht kopiert und der d'tor wird nur einmal aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990471</guid><dc:creator><![CDATA[Apollon]]></dc:creator><pubDate>Thu, 09 Feb 2006 20:15:46 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem im Destruktor on Thu, 09 Feb 2006 20:17:13 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3025">@Apollon</a>: Besser als einmal Ctor, zweimal Dtor, das klingt irgendwie... FALSCH <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/990472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990472</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 09 Feb 2006 20:17:13 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem im Destruktor on Fri, 10 Feb 2006 06:54:52 GMT]]></title><description><![CDATA[<p>Ok, und wieso wird mein Destruktor nur noch 1 Mal aufgerufen, jetzt wo mein Copy-Constructor korrekt ist?</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990593</guid><dc:creator><![CDATA[ChrisR]]></dc:creator><pubDate>Fri, 10 Feb 2006 06:54:52 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherproblem im Destruktor on Fri, 10 Feb 2006 08:33:11 GMT]]></title><description><![CDATA[<p>ChrisR schrieb:</p>
<blockquote>
<p>Ok, und wieso wird mein Destruktor nur noch 1 Mal aufgerufen, jetzt wo mein Copy-Constructor korrekt ist?</p>
</blockquote>
<p>Das nennt sich Optimierung - der Compiler rationalisiert die temporäre Variable weg, die für den Aufruf von SetString() benötigt wird und initialisiert deren Parameter direkt mit dem Default-Ctor.</p>
<p>(und da er nur ein Objekt erzeugt hat, benötigt er auch nur einen Dtor-Aufruf)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990644</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Fri, 10 Feb 2006 08:33:11 GMT</pubDate></item></channel></rss>