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 mallocd 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).

InformationsquelleAutor DrAl | 2010-11-11
Schreibe einen Kommentar