Segmentation Fault beim Zugriff auf (nicht-Zeiger) member-variable in die Qt-Klassen-Instanz
Ich habe einige Probleme mit einem segmentation fault verursacht durch den Zugang
um eine member-variable in einer Qt-Anwendung. Meine Erfahrung der Segmentierung
Störungen haben gezeigt, dass Sie in der Regel durch Zugriff auf einen Speicher
Lage außerhalb des gültigen Bereichs. Jedoch bin ich kämpfen, um herauszufinden,
warum dies der Fall sein würde in meinem code.
Der betreffenden Klasse ist eine Unterklasse von QFrame und enthält eine Reihe von
member-Variablen, darunter ein ursprünglich als m_Zoom
Typ
unsigned int
. Wenn der Rahmen geschaffen, eine Reihe von Funktionen aufgerufen werden
führen, dass die zoom-Stufe eingestellt werden und dann das Fenster gezeichnet. Diese
alles Prima funktioniert. Es gibt dann verschiedene Möglichkeiten, den zoom-level kann
geändert werden: öffnen Sie eine neue Datei oder drücken Sie entweder + oder -. Diese Lesen
die vorhandenen zoom-Stufe und dann entscheiden, ob es zu ändern. Einfach
das Lesen der vorhandenen zoom-Stufe verursacht einen segmentation fault.
Beachten Sie, dass diese variable ist kein Zeiger oder ein array oder was
ungewöhnliche. Die definition war entlang der Linien von:
class MyClass : public QFrame
{
Q_OBJECT
public:
MyClass(QWidget *parent = 0);
void SetZoomLevel(unsigned int zoom);
void ZoomIn();
protected:
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
private:
//A number of private functions for performing calculations
//Some variables including:
double m_OriginShift;
unsigned int m_Zoom;
//Some more variables
};
Die Funktion paintEvent
und alle mouse*
event-Funktionen zugreifen
m_Zoom
und diese gut funktionieren (die Maus wird zum verschieben der Ansicht
um Sie herum). Der Konstruktor ruft SetZoomLevel
(die im Grunde ist
m_Zoom = zoom
). Wieder, das funktioniert ohne Probleme. ZoomIn
beginnt
mit:
void MyClass::ZoomIn()
{
qDebug() << "Zoom In";
unsigned int existingZoom = m_Zoom; //[1]
qDebug() << "Existing zoom is " << existingZoom;
...
Den segmentation fault passiert in dieser Funktion, bevor die zweite
qDebug
Berichte nichts.
Habe ich versucht, Schritt durch die Anwendung in cygwin ist der gdb und bekomme ich
die Linie markiert [1]
und geben stepi
und erhalten sofort einen segfault.
Übersiedelt die variable um (in dem Fall, dass etwas anderes war nicht zu überschreiben
es ist Wohnort) geändert, um mit einem Zeiger mit malloc
d Speicher verschoben
in einer separaten Struktur, zog es in einer separaten Klasse (beide mit einem Mitglied Instanz und mit einem Mitglied Zeiger mit einem new
Zeile im Konstruktor) und
wahrscheinlich auch ein paar andere zufällige und erfolglosen Taten der Verzweiflung, ich habe
völlig die Ideen.
Bitte kann jemand empfehlen jedem guten Wege, die ich gehen könnte, zum Debuggen
dieses Problem?
Bin ich mit Qt 4.6.3 auf Windows XP kompilieren mit dem GNU Make 3.81 und g++
version 4.4.0 (von der mingw, der kam mit den Qt-installer).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist zwar eine wilde Vermutung, es gibt eine Möglichkeit, dass Sie fordern, dass die Methode auf ein null-Objekt.
Beachten Sie, dass:
entspricht
Wenn Sie nannte diese Methode einen null-Zeiger:
dann ist dies wahrscheinlich das Ergebnis, das Sie bekommen hatte - ein "segmentation fault" beim ersten Versuch der Dereferenzierung
this
Zeiger, das den Wertnull
.MyClass *m_scene
im Hauptfenster definition, dass war veraltet durch die Förderung Mechanismus in der.ui
- Datei. Allerdings wenn ich den AufrufZoomIn()
ich riefm_scene->ZoomIn()
stattui.scene->ZoomIn()
. Ich wurde ausgelöst durch die Tatsache, dass die debug-immer noch arbeitete. Vielen Dank für die Hilfe.