【问题标题】:Segmentation Fault when accessing (non-pointer) member variable in Qt class instance访问 Qt 类实例中的(非指针)成员变量时出现分段错误
【发布时间】:2010-11-11 11:30:29
【问题描述】:

我遇到了一些由访问引起的分段错误的问题 到 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 并立即获得段错误。

已经移动了变量(以防其他东西被覆盖 它的位置),更改为使用带有mallocd 内存的指针,移动 它进入一个单独的结构,将其移动到一个单独的类中(在构造函数中都有一个成员实例和一个带有new 行的成员指针)和 可能还有其他一些随机且不成功的绝望行为,我已经 完全没有想法。

请任何人建议我可以进行调试的任何好方法 这个问题?

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

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

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

    注意:

    unsigned int existingZoom = m_Zoom;
    

    等价于

    unsigned int existingZoom = this->m_Zoom;
    

    如果你从一个空指针调用这个方法:

    someUninitializedPtr->ZoomIn();
    

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

    【讨论】:

    • 宾果游戏!我完全密集并试图在错误的地方修复它。事实证明,我在主窗口定义中有一个旧的MyClass *m_scene,它已被.ui 文件中的提升机制弃用。但是,当我打电话给ZoomIn() 时,我打电话给m_scene-&gt;ZoomIn() 而不是ui.scene-&gt;ZoomIn()。我被调试仍然有效的事实所困扰。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多