在Qt类实例中访问(非指针)成员变量时出现分段错误

时间:2010-11-11 11:30:30

标签: c++ qt

我遇到了由访问引起的分段错误的一些问题 到Qt应用程序中的成员变量。我的细分经验 故障通常表明它们是访问存储器的结果 超出限制的位置。但是,我很难弄明白 为什么在我的代码中会出现这种情况。

有问题的类是QFrame的子类,包含许多 成员变量,包括最初称为m_Zoom类型的变量 unsigned int。创建框架时,会调用许多函数 这会导致设置缩放级别,然后绘制窗口。这个 一切正常。然后有缩放级别可以有多种方式 更改:打开新文件或按+或 - 。这些看了 现有的缩放级别,然后决定是否更改它。只是 读取现有缩放级别会导致分段错误。

请注意,此变量不是指针或数组或任何内容 异常。定义如下:

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行的成员指针)和 我可能还有其他一些随机和不成功的绝望行为 完全没有想法。

请有人建议我可以采取任何有关调试的方法 这个问题?

我在使用GNU Make 3.81和g ++编译的Windows XP上使用Qt 4.6.3 版本4.4.0(来自Qt安装程序附带的mingw)。

1 个答案:

答案 0 :(得分:10)

虽然这是一个疯狂的猜测,但你可能会在空对象上调用该方法。

请注意:

unsigned int existingZoom = m_Zoom;

相当于

unsigned int existingZoom = this->m_Zoom;

如果从空指针调用此方法:

someUninitializedPtr->ZoomIn();

那么这可能就是你得到的结果 - 首次尝试取消引用this指针时出现分段错误,其值为null