簡體   English   中英

在Qt類實例中訪問(非指針)成員變量時出現分段錯誤

[英]Segmentation Fault when accessing (non-pointer) member variable in Qt class instance

我由於訪問Qt應用程序中的成員變量而導致分段錯誤,出現了一些問題。 我對分段錯誤的經驗表明,它們通常是訪問超出范圍的內存位置的結果。 但是,我正在努力弄清楚為什么在我的代碼中會是這種情況。

所涉及的類是QFrame的子類,包含許多成員變量,包括一個最初稱為unsigned int類型的m_Zoom 創建框架時,將調用許多導致設置縮放級別的功能,然后繪制窗口。 這一切都很好。 然后,可以通過多種方式更改縮放級別:打開新文件或按+或-。 這些讀取現有的縮放級別,然后決定是否更改它。 僅僅讀取現有的縮放級別會導致分割錯誤。

請注意,此變量不是指針,也不在數組中,也不是任何異常。 定義大致如下:

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
};

函數paintEvent和所有mouse*事件函數都可以訪問m_Zoom並且它們可以正常工作(使用鼠標來移動視圖)。 構造函數調用SetZoomLevel (基本上是m_Zoom = zoom )。 同樣,這沒有問題。 ZoomIn開始於:

void MyClass::ZoomIn()
{
    qDebug() << "Zoom In";
    unsigned int existingZoom = m_Zoom; // [1]
    qDebug() << "Existing zoom is " << existingZoom;

    ...

在第二個qDebug報告任何內容之前,此功能發生分段錯誤。

我嘗試在cygwin的gdb中逐步執行該應用程序,然后轉到標記為[1]的行,鍵入stepi並立即獲得段錯誤。

移動了變量(以防萬一其他東西覆蓋了它的位置),更改為使用帶有malloc d內存的指針,將其移動到單獨的結構中,將其移動到單獨的類中(包括成員實例和成員指針)並在構造函數中添加了一行new的代碼),以及其他一些隨機且不成功的絕望行為,我已經完全沒有想法了。

請有人能建議我調試該問題的任何好方法嗎?

我正在Windows XP上使用Qt 4.6.3,並通過GNU Make 3.81和g ++版本4.4.0(來自Qt安裝程序隨附的mingw)進行了編譯。

盡管這是一個瘋狂的猜測,但您可能會在空對象上調用該方法。

注意:

unsigned int existingZoom = m_Zoom;

相當於

unsigned int existingZoom = this->m_Zoom;

如果從空指針調用此方法:

someUninitializedPtr->ZoomIn();

那么這很可能是您得到的結果-首次嘗試取消引用this指針的分段錯誤,其值為null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM