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

标签 c++ qt

我遇到了一些由访问引起的段错误问题 Qt 应用程序中的成员变量。我的 segmentation 经验 故障表明它们通常是访问内存的结果 超出范围的位置。但是,我正在努力弄清楚 为什么在我的代码中会出现这种情况。

有问题的类是 QFrame 的子类,包含许多 成员变量,包括一个最初叫做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 并且这些工作正常(鼠标用于移动 View 大约)。构造函数调用 SetZoomLevel(基本上是 m_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)。

最佳答案

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

注意:

unsigned int existingZoom = m_Zoom;

相当于

unsigned int existingZoom = this->m_Zoom;

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

someUninitializedPtr->ZoomIn();

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

关于c++ - 在 Qt 类实例中访问(非指针)成员变量时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4153929/

相关文章:

c++ - 在 Qt 中使用 $HOME

ios - 如何使用 San Francisco 字体在 Qt/QML 程序中为 ios 设计界面?

qt - Cmake:访问qt虚拟键盘模块

c++ - 全局多维数组未写入 [vs c++]

c++ - 我可以为抽象类提供 .cpp 文件吗?

c++ - 当有符号/无符号不匹配时会发生什么转换?

c++ - 为什么在派生类c++中找不到基类成员

qt - 如何在qml中设置自定义 slider 的初始值?

c++ - QImage垂直翻转

c++ - 覆盆子 pi3 : C++ serial communication not working properly (Raspberry pi was working! )