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

DrA*_*rAl 1 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
};
Run Code Online (Sandbox Code Playgroud)

函数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;

    ...
Run Code Online (Sandbox Code Playgroud)

在第二个qDebug报告任何内容之前,在此函数中发生分段错误 .

我已经尝试在cygwin的gdb中逐步执行应用程序,然后进入标记的行[1]并键入stepi并立即获得段错误.

移动变量后(如果其他东西覆盖了它的位置),改为使用带有malloc内存的指针,将其移动到一个单独的结构中,将其移动到一个单独的类中(包含成员实例和带有成员指针的成员)new在构造函数中的一行)以及可能的其他一些随机和不成功的绝望行为,我已经完全没有想法了.

请问任何人都可以提出任何有关调试此问题的好方法吗?

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

Kos*_*Kos 10

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

注意:

unsigned int existingZoom = m_Zoom;
Run Code Online (Sandbox Code Playgroud)

相当于

unsigned int existingZoom = this->m_Zoom;
Run Code Online (Sandbox Code Playgroud)

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

someUninitializedPtr->ZoomIn();
Run Code Online (Sandbox Code Playgroud)

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