Anzeige:
Ergebnis 1 bis 5 von 5

Thema: "Interressanter" Speicherzugriffsfehler

  1. #1
    Registrierter Benutzer
    Registriert seit
    08.05.2005
    Beiträge
    14

    "Interressanter" Speicherzugriffsfehler [solved]

    Ich stehe vor einem kleinen Rätsel:

    Ich habe eine Klasse, die als Glied einer verketteten Liste fungiert und einen Pointer auf eine Datenklasse enthält.

    Ich habe zwei verschiedene Methoden der Klasse, die in der verketteten Liste hängt, die dieselbe funktion der Datenklasse aufrufen. Leider stürzt das Programm bei einem Aufruf ab, beim andren jedoch nicht.

    Code:
    cMyData * cInternalNode::Search(cMyData * theData)
    {
    	if(MY_DEBUG)cout << "cInternalNode::Search()" << endl;
    	if(MY_DEBUG)cout << "myData: " << myData << endl;
    	myData->Show(); // <- hier funktionierts
    [...] }
    
    void cInternalNode::Show()
    { 
    	if(MY_DEBUG)cout << "cInternalNode::Show()" << endl; 
    	if(MY_DEBUG)cout << "myData: " << myData << endl;
    	myData->Show();  // <- hier gibts nen segfault
    [...] }
    Ich bin ratlos .. wie kann es sein, dass die Funktion mal geht und mal nicht?
    btw: myData hat bei beiden Aufrufen den selben Wert, zeigt also auf dieselbe Instanz der Datenklasse.

    Ein theoretischer Ansatz, wie sowas möglich ist wäre schonmal genug *gg*
    Geändert von Odzilla (11-11-2005 um 15:07 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Ich bin ratlos .. wie kann es sein, dass die Funktion mal geht und mal nicht?
    Das ist so gut wie immer die falsche Frage. Eigentlich müsste die Frage lauten "Warum sollte die Funktion immer das gleiche Fehlerverhalten zeigen?" Mit deiner Frage versuchst du nämlich in den Fehler mehr hinein zu interpretieren als drin steckt. Für den Fehlerfall geben verbreitete C++-Implementierungen wenige Garantien. Man sollte also kein systematisches Verhalten erwarten.

  3. #3
    Registrierter Benutzer
    Registriert seit
    08.05.2005
    Beiträge
    14
    Naja ... später im Programmablauf bekomme ich immer das selbe: Segfault

    Aber der Fehler deutet doch darauf hin, dass myData seine Gültigkeit verloren hat. Andererseits liefert die Funktion ja das richtige Ergebnis.

    Naja werd mir mal den Speicherbereich anschaun.

    edit:
    Naja man braucht nur nen Kaffee, dann löst sich alles
    Ka warum, aber jetzt scheints zu laufen.

    Trotzdem Danke
    Geändert von Odzilla (11-11-2005 um 15:06 Uhr)

  4. #4
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320
    Speicherzugriffsfehler wirken sich oft erst später aus. Wenn z.B. ein uninitialisierter Zeiger verwendet wird oder über den Rand eines Buffer gelesen wird, zeigt sich der Fehler direkt. Oft passiert es, dass irgendwo Speicher überschrieben wird, der erst später zu einem Fehler führt. Und da das vom Zustand des Programms abhängt passiert das nicht regelmässig.

    Ein sehr beliebter Fehler ist z.B. das zweifache Freigeben von Speicher. Damit zerstört man malloc-interne Strukturen, die erst beim nächsten oder übernächsten malloc() zu einem Segfault führen.

    Solche Fehler verhindert man am besten in dem man sauber, überlegt und konsequent programmiert.

    Kommt man in den Genuss ein fremdes Programm auf solche Fehler zu überprüfen, so kann man die Debug-Funktionen der libc malloc Funktion nutzen, malloc Debugging libraries verwenden oder Tools wie valgrind einsetzen. Oder noch besser: Das Programm neu schreiben.

    Gruss, Andy

  5. #5
    Registrierter Benutzer
    Registriert seit
    08.05.2005
    Beiträge
    14
    In diesem Fall: Mal wieder neu schreiben

    Das nachträgliche Umstellen des Programms auf das Benutzen von Threads war keine allzu blendende Idee ^^

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •