Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Destruktor

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.02.2006, 16:48 Uhr
~ChrisR
Gast


Hallo!

Ich habe folgenden Code:


Code:
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;
}



Das Programm stürzt jedoch im Destruktor ab, da dieser 2 Mal ausgeführt wird
(ein Mal wenn setString endet und ein Mal wenn main endet). Es wird also
versucht das im Konstruktor erzeugte Array 2 Mal freizugeben, was natürlich
nicht funktioniert.

Jedoch drüfte imho der Destruktor gar nicht 2 Mal laufen, da ja nur 1 Objekt
erzeugt wird. Wenn ich einen Copy-Construktor hinzufüge, dann wird der
Destruktor (wie erwartet) nur 1 Mal ausgeführt. Der Copy-Construktor selbst
wird jedoch nie ausgeführt (weshalb es eigentlich egal sein müsste ob ich überhaupt einen Copy-Construktor implementiere).

Ich habe versucht den obigen Code als normale Win32-Konsolenapplikation mit dem VC++-Compiler zu kompilieren. Wenn ich den gleichen Code unter Linux, MacOS oder auch unter Windows mit einem anderen Compiler übersetze, dann wird der Destruktor (auch
ohne hinzugefügten Copy-Construktor) nur 1 Mal ausgeführt (so wie es eigentlich sein sollte).

Kann das an den Einstellungen in Visual Studio liegen? Ist es ein Fehler im VC++-Compiler? Wie sollte sich das Programm nach dem ANSI-Standard verhalten?

Danke im Voraus!

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.02.2006, 16:52 Uhr
Pler
Einer von Vielen
(Operator)


Mich wundert ja,dass das Überhaupt läuft, da ja gar kein Objekt erzeugt wird.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.02.2006, 16:54 Uhr
~ChrisR
Gast


Doch, es wird ein Objekt erzeugt: direkt im setString-Aufruf.

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.02.2006, 18:39 Uhr
(un)wissender
Niveauwart


Das übliche Problem, haben wir schon x-mal gehabt. Durch temp. Objekte wird c mehrfach gelöscht.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.02.2006, 18:48 Uhr
stephanw
localhorst


Genau. Was da fehlt, sind Zuweisungsoperator und Copy-Konstruktor, die die Objekte geeignet kopieren (der Funktionsaufruf kopiert Deinen String! ).

Suchmal danach, da müsstest Du was finden.
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.02.2006, 21:10 Uhr
~ChrisR
Gast


Es liegt weder am Copy-Construktor, nocht am Assignment-Operator. Wenn ich die beiden implementiere läuft das Programm zwar, aber nicht deswegen weil dann der Speicher für beide Objekte getrennt existiert (und getrennt freigegeben wird).

Es ist vielmehr so: sobald ich den Copy-Construktor implementiere wird der Destruktor nur mehr 1 Mal aufgerufen statt 2 Mal (keine Ahnung warum). Der Copy-Construktor selbst (sowie der Assignment-Operator) werden nie ausgeführt (habe ich durch eine Testausgabe und den Debugger festgestellt). Daher dürfte es eigentlich egal sein ob es den Copy-Construktor gibt oder nicht (bzw. den Compiler-generierten).

Ich vermute dass der Copy-Construktor deswegen nicht läuft, weil das neue Objekt nicht erstellt und dann für den Aufruf kopiert wird, sondern gleich am Stack von setString angelegt wird (wahrscheinlich eine Optimierung, weil String() direkt im Aufruf steht).

Aber egal was der Grund für die Nicht-Ausführung des Copy-Construktors ist: die Existenz des Copy-Construktors kann sich doch nicht darauf auswirken wie oft der Destruktor läuft (d.h. wie viele Objekte erzeugt werden) - höchstens darauf wie die Objekte aussehen.

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.02.2006, 22:11 Uhr
(un)wissender
Niveauwart


Chris, deine obige Klasse ist schlicht falsch. Der Zeiger wird bitweise kopiert und es wird nicht festgehalten, welches Objekt den Zeiger löschen darf. Ergo -> Multidelete. Bitte glaub das.
Es kann mit unterschiedlichen Compilern und Optimierungstufen zu variierenden Aufrufen und Anzahlen temporären Objekten kommen, dass ist aber nichts was dich hier interessieren sollte.
Mache erstmal deine Klasse korrekt, dann sehen wir weiter.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.02.2006, 07:54 Uhr
~ChrisR
Gast


Ok, und wieso wird mein Destruktor nur noch 1 Mal aufgerufen, jetzt wo mein Copy-Constructor korrekt ist?

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
10.02.2006, 10:12 Uhr
ao

(Operator)



Zitat von ~ChrisR:
Ok, und wieso wird mein Destruktor nur noch 1 Mal aufgerufen, jetzt wo mein Copy-Constructor korrekt ist?

Das kann, wie der (un)wissende schon schrieb, an der Optimierung oder an anderen Compilereinstellungen liegen. Ist von außen schlecht zu beurteilen. Aber poste doch einfach noch mal deine Klasse, so wie sie jetzt ist.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: