 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Jochen Luig Guest
|
Posted: Wed Dec 15, 2004 1:59 pm Post subject: Frage zu Destruktoren |
|
|
Hallo!
Ich habe eine Klasse, die als Attribut eine std::list<int> enthält. Für
die Klasse habe ich den operator< überladen. Irrtümlich hatte ich einen
Destruktor, der mit delete den Destruktor der Liste aufruft, obwohl sie
nie mit new initialisiert wurde.
Wenn ich den operator< drei mal auf einer Instanz der Klasse aufrief,
bekam ich einen Segmentation fault. Ok, bei jedem Aufruf entsteht eine
neue Instanz der Klasse, deren Destruktor am Ende der Methode aufgerufen
wird. Mich macht nur stutzig, dass das 2 mal gut geht und erst beim
dritten Aufruf zu einem Segmentation fault führt. Kann mir das jemand
erklären?
Falls das wichtig ist, ich benutze den g++ 3.3.3 unter Linux.
Gruß
Jochen
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Jochen Luig Guest
|
Posted: Wed Dec 15, 2004 2:54 pm Post subject: Re: Frage zu Destruktoren |
|
|
Nachtrag: Das Attribut ist ein Zeiger auf std::list<int>
Gruß
Jochen
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Martin Kaul Guest
|
Posted: Wed Dec 15, 2004 3:01 pm Post subject: Re: Frage zu Destruktoren |
|
|
Jochen Luig wrote:
| Quote: | Hallo!
Ich habe eine Klasse, die als Attribut eine std::list<int> enthält. Für
die Klasse habe ich den operator< überladen. Irrtümlich hatte ich einen
Destruktor, der mit delete den Destruktor der Liste aufruft, obwohl sie
nie mit new initialisiert wurde.
Wenn ich den operator< drei mal auf einer Instanz der Klasse aufrief,
bekam ich einen Segmentation fault. Ok, bei jedem Aufruf entsteht eine
neue Instanz der Klasse, deren Destruktor am Ende der Methode aufgerufen
wird. Mich macht nur stutzig, dass das 2 mal gut geht und erst beim
dritten Aufruf zu einem Segmentation fault führt. Kann mir das jemand
erklären?
Hmm, delete auf etwas, dass nie mit new erzeugt wurde hat wohl |
undefiniertes Verhalten :-)
Undefiniertes Verhalten bedeutet... Überraschung ...das das Verhalten
nicht vorhergesehen werden kann, d.h. in deinem Fall die ersten zwei
deletes irgend was gemacht haben und das Programm durch ein kleines
Wunder trotzdem noch weiterlief ;-)
Auf ner anderen Plattform hätte es vielleicht gleich beim ersten Mal
gekracht.
tschaule
Martin
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Jochen Luig Guest
|
Posted: Thu Dec 16, 2004 11:42 am Post subject: Re: Frage zu Destruktoren |
|
|
Martin Kaul wrote:
| Quote: |
Hmm, delete auf etwas, dass nie mit new erzeugt wurde hat wohl
undefiniertes Verhalten
Na, wer macht denn so was?  |
Ok, die lange Beschäftigung mit Skriptsprachen hat wohl nicht gerade
meine Fähigkeiten im Speichermanagement gefördert. Da wird die
Kaffeemaschine wohl noch einige Wochen Überstunden machen.
Danke für Deine Antwort!
Gruß
Jochen
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Nicolas Pavlidis Guest
|
Posted: Thu Dec 16, 2004 1:04 pm Post subject: Re: Frage zu Destruktoren |
|
|
Jochen Luig <jochen_usenet (AT) gmx (DOT) de> writes:
| Quote: | Hallo!
Ich habe eine Klasse, die als Attribut eine std::list
enthält. Für die Klasse habe ich den operator< überladen. Irrtümlich
hatte ich einen Destruktor, der mit delete den Destruktor der Liste
aufruft, obwohl sie nie mit new initialisiert wurde.
|
Eine Frage:
Wie greifst du auf den Pointer zu, wenn du ihn nicht den Speicher auf
den er Zeigt mittels new angelegt hast.
| Quote: | Wenn ich den operator< drei mal auf einer Instanz der Klasse aufrief,
bekam ich einen Segmentation fault. Ok, bei jedem Aufruf entsteht eine
neue Instanz der Klasse, deren Destruktor am Ende der Methode
aufgerufen wird. Mich macht nur stutzig, dass das 2 mal gut geht und
|
Wie ist denn dein operator < implementiert?
| Quote: | erst beim dritten Aufruf zu einem Segmentation fault führt. Kann mir
das jemand erklären?
Falls das wichtig ist, ich benutze den g++ 3.3.3 unter Linux.
|
Find ich auch interessant, dass das immer beim dritten Mal passiert,
kannst du vielleicht eine Referenz auf deinen Code posten, dann kann dir
vielleicht besser geholfen werden.
Aber das hauptptoblem hast du eh schon selbst erkannt , das mit dem
falschen Konstruktor mein ich.
LG
Nicolas
--
| Quote: | Nicolas Pavlidis | Elvis Presly: | |__ |
Student of SE & KM | "Into the goto" | |__| |
[email]pavnic (AT) sbox (DOT) tugraz.at[/email] | ICQ #320057056 | |
-------------------University of Technology, Graz----------------|
|
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Jochen Luig Guest
|
Posted: Fri Dec 17, 2004 12:07 pm Post subject: Re: Frage zu Destruktoren |
|
|
Nicolas Pavlidis wrote:
| Quote: | Eine Frage:
Wie greifst du auf den Pointer zu, wenn du ihn nicht den Speicher auf
den er Zeigt mittels new angelegt hast.
|
[...]
| Quote: | Wie ist denn dein operator < implementiert?
|
[...]
| Quote: | Find ich auch interessant, dass das immer beim dritten Mal passiert,
kannst du vielleicht eine Referenz auf deinen Code posten, dann kann dir
vielleicht besser geholfen werden.
|
Ich habe mal ein kleines Beispiel geschrieben, in dem der Effekt (da
allerdings bereits beim 2. Mal) auftritt:
http://de.geocities.com/skirnir71/example.tar.gz
Der Code sollte alle Fragen beantworten.
Gruß und Danke
Jochen
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Andre Poenitz Guest
|
Posted: Sat Dec 18, 2004 8:05 am Post subject: Re: Frage zu Destruktoren |
|
|
Jochen Luig <jochen_usenet (AT) gmx (DOT) de> wrote:
| Quote: | Ok, die lange Beschäftigung mit Skriptsprachen hat wohl nicht gerade
meine Fähigkeiten im Speichermanagement gefördert.
|
Wieso hast Du ueberhaupt einen Zeiger auf die Liste un nicht die Liste
selbst?
Andre'
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Kai Ruhnau Guest
|
Posted: Sun Dec 19, 2004 9:21 am Post subject: Re: Frage zu Destruktoren |
|
|
Jochen Luig wrote:
| Quote: | Nicolas Pavlidis wrote:
Eine Frage:
Wie greifst du auf den Pointer zu, wenn du ihn nicht den Speicher auf
den er Zeigt mittels new angelegt hast.
[...]
Wie ist denn dein operator < implementiert?
[...]
Find ich auch interessant, dass das immer beim dritten Mal passiert,
kannst du vielleicht eine Referenz auf deinen Code posten, dann kann dir
vielleicht besser geholfen werden.
Ich habe mal ein kleines Beispiel geschrieben, in dem der Effekt (da
allerdings bereits beim 2. Mal) auftritt:
http://de.geocities.com/skirnir71/example.tar.gz
Der Code sollte alle Fragen beantworten.
|
Du übergibst an deine operator< Funktion das A als Kopie. Da du keinen
Copy-constructor definiert hast, wird der list-pointer einfach nur
kopiert. Bist du nun am Ende der Vergleichsfunktion, wird von dieser
A-Kopie der Destructor aufgerufen und der Speicher für die list
freigegeben. Das ursprüngliche A hat damit einen ungültigen Pointer
gespeichert und es ist nur noch eine Frage der Zeit, bis der
Undefiniertes-Verhalten-Hammer zuschlägt.
Für sowas gibt es diverse Lösungsmöglichkeiten.
a) Pointer quasi immer in Smart-Pointern unterbringen.
b) Die Signatur deiner Vergleichsfunktion ist falsch. Da du innerhalb
dieser Funktion die Objekte nicht veränderst, sollte die Signatur
bool A::operator<(A const&) const
sein.
c) Für deine Klasse war es nötig einen Destruktor zu implementieren. In
so einem Fall ist es quasi immer auch nötig Copy-Constructor und
Assignment-Operator zu implementieren. (Die in diesem Fall Tiefe Kopien
der Liste erstellen und nicht einfach den Pointer kopieren).
Grüße
Kai
--
This signature is left as an exercise for the reader.
Unsatz des Jahres:
$POLITIKER ruft $PARTEI zur Geschlossenheit.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|