Speicherproblem im Destruktor

  • Hallo!

    Ich habe folgenden Code geschrieben:


    Bei diesem Code läuft der String-Destruktor ~String nicht ein, sondern 2 Mal (jeweils am Ende von setString und von main). Ich kann mir das nicht erklären, denn es wird doch nur eine String-Instanz erstellt. Wenn ich in die String-Klasse einen Copy-Constructor einfüge, dann wird der Destruktor wie erwartet nur 1 Mal aufgerufen (der Copy-Constructor selbst jedoch nicht, weshalb es eigentlich keine Rolle spielen dürfte wenn dieser fehlt).

    Als Compiler verwende ich den VC++-Compiler. Wenn ich das gleiche Programm unter Linux mit dem gcc kompiliere wird der Destruktor nur 1 Mal ausgeführt (so wie es imho sein sollte). Ich kann mir aber nicht vorstellen dass das ein Fehler im MS-Compiler ist, weil solche Konstrukte sicher oft verwendet werden.

    Kann mir das jemand erklären?

    Nebenfrage: Ist es eigentlich normal dass hier:

    Code
    setString(String());

    der Copy-Constructor nicht läuft?

    mfg

  • Meiner Ansicht nach werden 2 String Instanzen erstellt:
    Eine Instanz wird in main() mittels String() erzeugt.
    Eine zweite Instanz wird erzeugt, da du diesen String per Kopie als Argument übergibst. Dabei sollte eigentlich der copy-Konstruktor aufgerufen werden, der für eine korrekte Kopie des Strings sorgen muss (der char array muss in der neuen Instanz neu angelegt werden, damit bei der Destruktion nicht derselbe Speicherbereich zweimal freigegeben wird). Somit wäre auch klar, dass der Destruktor zweimal gerufen werden muss.

    Allerdings ist es auch möglich, dass der Compiler die Instanz in main() wegoptimiert, da diese nur an setString() übergeben wird und ansonsten in main() nirgends verwendet wird. Damit würde dann auch die Benützung des copy-Konstruktors entfallen.

    Was allerdings da wirklich genau abläuft, und wieso der VC++ Compiler
    mal eine, mal zwei Instanzen erstellt, kann ich auch nicht genau sagen.

  • Optimierung beiseite, was hier fehlt, ist ein Copy-Constructor.

    Code
    String(const String &rhs)
    {
      c = new char[100];
      strcpy(c, rhs.c);
    }


    Code mit allen Vorbehalten (Overflow!!!)

    All the buzzt
    CornedBee :rolleyes:

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!