gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:24:01 26 4
gpt4 key购买 nike

我遇到了一些由访问引起的段错误问题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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com