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 |