[英]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.