[Gelöst] Was ist eine Access Violation und wie behebe ich sie?



  • Hallo zusammen,
    ich bin jetzt soweit, dass ich eine beträchtliche Menge Code geschreiben habe (für mich sind ~3000 Zeilen viel). Leider spuckt mein Programm ziemlich sofort, nachdem ich das Debuggen gestartet habe, eine Access Violation aus.
    Ich weiß ansatzweise, was das ist (ein Teil meines Programmes greift auf einen Speicherbereich zu, der mir nicht gehört). Doch was heißt, dass er mir nicht gehört? Ich habe keine Speicherverwaltung a la malloc() verwendet. MUSS ich das? (Bitte entschuldigt, wenn meine Frage irgendwie banal ist und ich wahrscheinlich absolut keine Ahnung habe, wie Speicherverwaltung angeht)
    Der Großteil des Programmes besteht aus Klassen- und struct-Definitionen, nur ein kleiner Teil ist das wahre Procedere.
    Wenn die Access Violation auftritt, ist neben einer Codezeile ein kleiner grüner Pfeil. Ist diese Codestelle dann die, die ausgeführt wurde und bei der das Problem auftrat oder die Stelle, die eigentlich als nächstes ausgeführt werden müsste (Visual Studio 2008 Pro)?
    Wenn ich weiß, welche Codezeile der Verursacher ist, wie kann ich das Problem beheben?

    Vielen Dank schon Mal im Voraus und ein schönes Wochenende,
    Gruß,
    Lauritz



  • LauritzG schrieb:

    Wenn ich weiß, welche Codezeile der Verursacher ist, wie kann ich das Problem beheben?

    Den Fehler entfernen zum Beispiel?



  • Access Violation ist ein Zugriffsfehler im Speicher. Du greifst auf Speicher zu, der dir nicht gehört.

    Dies kannst du auf verschiedene Arten realisieren... Die häufigste ist wohl, dass du durch Zeiger-Manipulation auf ungültigen Speicher zugreifst. Dazu gehört ebenfalls das Zugreifen auf einen ungültigen Index vom Array, z.B.
    int arr[5];
    arr[5] <-- Ungültiger Index!! Kann Access Violation verursachen, muss es aber nicht. Ist auf jedem Fall fehlerhafter Code.



  • Aber ich muss nichts mit malloc() und KOnsorten allokieren? Weil einen ungültigen Index habe ich ziemlich sicher nicht genommen (for(int i = 0; i < [Anzahl der Indizes]; i++)).



  • Nein, du musst nichts mit malloc() (C-Funktion!) oder new allokieren, um eine Access Violation zu bekommen.



  • 3000 Zeilen Code
    Visual Studio 2008 Pro
    keine Ahnung was da passiert?

    irgendwas versteh ich hier nicht...

    aber ok. poste doch mal die zeile die die av wirft.

    MfG



  • InitializeCriticalSection(&system->cs);
    

    An dieser Stelle kommt dann die av.
    system ist ein Member der gleichen Klasse wie die Funktion, in der diese Zeile vorkommt. Innerhalb von system gibt es ein Member namens cs, eine critical section.
    Gruß
    Lauritz

    PS: Wegen malloc bin ich beruhigt... Habe keine Ahnung davon... 🤡



  • Ich dachte du allokierst nichts selbst? Da du den -> Operator benutzt, muss es sich bei system um einen Zeiger handeln. Dieser Zeiger muss ja auf irgend etwas zeigen...



  • Haha... ich glaube, dank deiner Hilfe, Janjan, habe ich mein Problem gerade selber gelöst. In der Klasse, in der alle Funktionen drin waren, war g_sys nur ein Zeiger, dessen Inhalt man noch festlegen musste. Jetzt habe ich in main.cpp

    systemstruct mysystem;
    program.system = &mysystem;
    

    Und es funktioniert (Soweit ich weiß, weil der nächste Fehler schon an die Tür klopft, da scheine ich wohl was mit vsprintf falsch gemacht zu haben (Debug Assertion failed)).
    Vielen vielen Dank euch allen! Ihr habt mir sehr geholfen!
    Gruß
    Lauritz



  • so ein fehler <kann> auftreten, wenn z.b. der zeiger länger lebt, als
    das objekt auf das es zeigt. in deinem beispiel zeigt der zeiger auf eine
    lokale variable. sobald die funktion zu ende ist, wird die struktur ungültig.

    da du aber noch ein zeiger auf das teil hast, geht der zugriff darauf
    schief.


Anmelden zum Antworten