C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Frage zu Destruktoren

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Jochen Luig
Guest





PostPosted: Wed Dec 15, 2004 1:59 pm    Post subject: Frage zu Destruktoren Reply with 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?
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





PostPosted: Wed Dec 15, 2004 2:54 pm    Post subject: Re: Frage zu Destruktoren Reply with quote



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





PostPosted: Wed Dec 15, 2004 3:01 pm    Post subject: Re: Frage zu Destruktoren Reply with quote



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





PostPosted: Thu Dec 16, 2004 11:42 am    Post subject: Re: Frage zu Destruktoren Reply with quote

Martin Kaul wrote:
Quote:

Hmm, delete auf etwas, dass nie mit new erzeugt wurde hat wohl
undefiniertes Verhalten Smile
Na, wer macht denn so was? Wink


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





PostPosted: Thu Dec 16, 2004 1:04 pm    Post subject: Re: Frage zu Destruktoren Reply with quote

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 Smile, 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





PostPosted: Fri Dec 17, 2004 12:07 pm    Post subject: Re: Frage zu Destruktoren Reply with quote

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





PostPosted: Sat Dec 18, 2004 8:05 am    Post subject: Re: Frage zu Destruktoren Reply with quote

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





PostPosted: Sun Dec 19, 2004 9:21 am    Post subject: Re: Frage zu Destruktoren Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.