1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Speicherproblem im Destruktor

  • Christoph R.
  • 9. Februar 2006 um 19:28
  • Unerledigt
  • Christoph R.
    16
    Christoph R.
    Mitglied
    Reaktionen
    36
    Punkte
    2.626
    Beiträge
    428
    • 9. Februar 2006 um 19:28
    • #1

    Hallo!

    Ich habe folgenden Code geschrieben:

    Code
    [B]
    class[/B] String{ 
    [B]private[/B]: 
        [B]char[/B]* c; 
    [B]public[/B]: 
        String(){ 
            c = [B]new char[/B][100]; 
        } 
     
        ~String(){ 
            [B]delete[/B] []c; 
        } 
    }; 
     
    [B]void[/B] setString(String s){ 
    } 
     
    [B]int[/B] main([B]int[/B] argc, [B]char[/B]* argv[]){ 
        setString(String()); 
        [B]return[/B] 0; 
    }
    Alles anzeigen


    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

  • volatile_void
    3
    volatile_void
    Mitglied
    Punkte
    45
    Beiträge
    9
    • 10. Februar 2006 um 00:43
    • #2

    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.

  • Christoph R.
    16
    Christoph R.
    Mitglied
    Reaktionen
    36
    Punkte
    2.626
    Beiträge
    428
    • 10. Februar 2006 um 07:56
    • #3

    Ja, er wird vermutlich die eine Instanz wegoptimieren. Aber dann dürfte auch der Destruktor nur 1 Mal laufen.

    mfg

  • CornedBee
    2
    CornedBee
    Mitglied
    Punkte
    30
    Beiträge
    6
    • 6. März 2006 um 11:39
    • #4

    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 :face_with_rolling_eyes:

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung