【发布时间】: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)。
【问题讨论】: