2011-05-09 60 views
1

我有以下的Qt類:神祕SIGABRT如果某些成員變量在構造函數初始化

class GLWidget : public QGLWidget 
{ 
    Q_OBJECT 
public: 
    GLWidget(QWidget *parent = 0); 
private: 
    void initializeGL(); 
    void resizeGL(int w, int h); 
    void paintGL(); 

    double posX; 
    double posY; 
    double posZ; 
}; 

當我把這個在構造函數中,我的程序產生SIGABRT期間GLWidget::~GLWidget

this->posX = 0.0; 
this->posY = 0.0; 
this->posZ = 1.0; 

這些成員變量沒有在課堂上使用其他任何地方。如果我不初始化成員變量,程序不會失敗。這怎麼會導致SIGABRT

堆棧跟蹤

Stack trace

+0

有了這樣的問題,你應該表現出更多的代碼,錯誤不可能在你的例子轉載。真正的錯誤可能在代碼中的任何地方。添加這些特定行使程序崩潰的事實並不意味着代碼中的錯誤與這些行相關。 – rohanpm 2011-05-09 22:32:56

回答

3

你檢查的核心文件,看看它死了?

那說,最可能的情況是除以零和/或斷言X和Y都不爲零。

編輯:此外它似乎很可能,當你不初始化的值程序行爲錯誤,但它只是出現正常/更好地工作。

EDIT2迴應評論:您可以配置unix/linux系統(使用coreadm)在程序崩潰或中止時留下「核心」文件。它包含有關調用堆棧,寄存器,內存等的信息。它看起來似乎找到了它(或類似的東西)。上面寫着

免費線():無效的下一個尺寸(快速): 0x00000000006e3110 *

實際上使我改變了主意。它看起來像你的堆已損壞,並且刪除導致它變得可見。一種可能性是你刪除了對象兩次。如果你在Linux上,valgrind可能是你找出發生的事情的最好方法。

+0

+1,僅僅是因爲當它證明是正確的時候你會成爲上帝。 :) – 2011-05-09 15:21:55

+0

核心文件?你是這個意思嗎? http://pastebin.com/mzLH0nkd – Pieter 2011-05-09 15:33:53

+0

Valgrind的信息:http://pastebin.com/4mGhSz4v錯誤似乎與我的顯卡驅動... – Pieter 2011-05-09 17:24:08

3

添加這些變量四處移動代碼。在發生重排之前,有一個地方沒有引起明顯問題。我會在調試器中運行它,或者添加日誌記錄來確定問題出在哪裏。使用「分而治之」的方法來最小化發現錯誤的時間。

相關問題