2016-05-13 6 views
-2

Ich habe ein Problem mit dem VS 2013-Fehler. Ich habe ein Programm, das ich tatsächlich ausführen kann. Aber wenn ich in der, wenn Schleife geben Sie unten, während das Programm ausgeführt wird, es Crashs und ich bekomme diese Fehlermeldung:Erste-Chance-Ausnahme bei 0x00007FF7214BAB0C in v1.exe: 0xC0000005: Zugriffsverletzungsleseposition 0xFFFFFFFFFFFFFFFF

First-chance exception at 0x00007FF7214BAB0C in v1.exe: 0xC0000005: Access >violation reading location 0xFFFFFFFFFFFFFFFF. Unhandled exception at 0x00007FF7214BAB0C in v1.exe: 0xC0000005: Access >violation reading location 0xFFFFFFFFFFFFFFFF.

Mouvement.cpp

void Mouvement::processFrame(bool boolarray[], Game * game){ 
    if (boolarray[0]){ 
     qDebug() << game; 
     qDebug() << game->getPlayer1()->aNumber; 
    } 
} 

würde Ich mag zu erwähnen, dass aNumber ist nur ein öffentliches int-Attribut aus der Player-Klasse. QDebug ist in der Lage, den Zeiger des Spiels zu erkennen, aber das Ergebnis von Player1 scheint der Ort zu sein, an dem das Problem auftritt. Hier ist es Codes:

Game.cpp

Player * Game::getPlayer1(){ 
    return this->player1; 
} 

Game.h.

Ich bin ein echter Anfänger bei C++ und Qt, so dass die Antwort albern sein könnte.

+6

'qzdae48679jkl'? "Ja wirklich?" – SergeyA

+0

eigentlich war es zu erinnern, was in der Tabelle so ist, ja es scheint dumm, aber es hat seine eigene Logik. – pepece

+1

Wenn dies Visual Studio auf der Registerkarte Debug/Exceptions ist, aktivieren Sie die Unterbrechung bei Zugriffsverletzung in den Win32-Ausnahmen. Wenn der Debugger dann bricht, folgen Sie dem Callstack bis zu der Zeile Ihres Codes, die den Fehler verursacht. – drescherjm

Antwort

0

Meistens "Zugriffsverletzung" ist auch von "Segmentation fault", was bedeutet, dass Sie versuchen, auf Speicher zuzugreifen, auf den Sie keinen Zugriff haben. Dies ist beispielsweise der Fall, wenn Sie auf die Elemente eines Arrays zugreifen, die nicht ordnungsgemäß initialisiert wurden, oder nach dem Ende des Arrays, oder versuchen, einen Zeiger zu dereferenzieren, der nicht initialisiert wurde.

In Ihrem Fall würde ich Folgendes tun:

if ((game == NULL) || (game->getPlayer1() == NULL)) 
    throw std::runtime_exception("Null pointers"); 

if (qzdae48679jkl && game && qzdae48679jkl[0]){ 
    qDebug() << game; 
    qDebug() << game->getPlayer1()->aNumber; 
} 

Dies wird testen, ob alle Zeiger nicht null sind, bevor sie zugreifen. Aber beachte, dass dies NICHT ausreichend ist; Sie sollten auch sicherstellen, dass player1 und player2 entweder auf NULL festgelegt oder in allen Konstruktoren von Game ordnungsgemäß initialisiert sind.

+0

Eigentlich bin ich nicht sicher, dass es der Punkt ist, weil es lesen kann, dass qzdae48679jkl [0] "wahr" ist, da ich die erste Zeile in der Schleife ausführen kann. Es bricht, wenn ich in die zweite Zeile kam: 'qDebug() << game-> getPlayer1() -> aNumber; } 'Immer noch, danke für die Antwort ... – pepece

+0

@pepece Siehe meine Bearbeitung. – Sheljohn

+0

'qDebug() << Spiel;' sagen Sie mir, dass es ein Zeiger auf ein QGraphicsView-Element ist, die wahr ist. Aber ich kann 'qDebug() << * game nicht anzeigen, weil es in der QGraphicsView-Klasse laut intellisense keinen << -Operanden gibt. – pepece

Verwandte Themen