2010-11-11 18 views
1

我在Qt應用程序的成員變量中訪問 導致了段錯誤。我對分段 錯誤的體驗表明它們通常是訪問內存不足的結果。然而,我正在努力找出 爲什麼在我的代碼中會出現這種情況。在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)。

回答

10

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

需要注意的是:

unsigned int existingZoom = m_Zoom; 

相當於

unsigned int existingZoom = this->m_Zoom; 

如果您呼叫從一個空指針這個方法:

someUninitializedPtr->ZoomIn(); 

那麼這可能是導致你得到 - 第一次嘗試取消引用this指針時出現分段錯誤,其值爲null

+0

賓果!我正在完全密集,並試圖修復它在錯誤的地方。事實證明,我在'.ui'文件中的升級機制中棄用了主窗口定義中的舊'MyClass * m_scene'。但是,當我調用'ZoomIn()'時,我正在調用'm_scene-> ZoomIn()'而不是'ui.scene-> ZoomIn()'。調試仍然有效的事實引發了我。謝謝您的幫助。 – DrAl 2010-11-11 11:58:38

相關問題