代码之家  ›  专栏  ›  技术社区  ›  DrAl

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

  •  1
  • DrAl  · 技术社区  · 14 年前

    我对访问导致的分段错误有一些问题 到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_缩放 这些工作正常(鼠标用来移动视图 在附近)。构造函数调用 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)。

    1 回复  |  直到 14 年前
        1
  •  10
  •   Kos    14 年前

    虽然这是一个疯狂的猜测,但有一种可能是您正在对空对象调用该方法。

    注意:

    unsigned int existingZoom = m_Zoom;
    

    相当于

    unsigned int existingZoom = this->m_Zoom;
    

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

    someUninitializedPtr->ZoomIn();
    

    那么这可能就是你在第一次尝试解引用时会得到的结果-一个分段错误 this 指针,值为 null .