我遇到了由访问引起的分段错误的一些问题 到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
的行,并立即获得段错误。
移动了变量(以防其他东西被覆盖
它的位置),改为使用带有malloc
d内存的指针移动
它进入一个单独的结构,将它移动到一个单独的类中(包括一个成员实例和一个构造指针中带有new
行的成员指针)和
我可能还有其他一些随机和不成功的绝望行为
完全没有想法。
请有人建议我可以采取任何有关调试的方法 这个问题?
我在使用GNU Make 3.81和g ++编译的Windows XP上使用Qt 4.6.3 版本4.4.0(来自Qt安装程序附带的mingw)。
答案 0 :(得分:10)
虽然这是一个疯狂的猜测,但你可能会在空对象上调用该方法。
请注意:
unsigned int existingZoom = m_Zoom;
相当于
unsigned int existingZoom = this->m_Zoom;
如果从空指针调用此方法:
someUninitializedPtr->ZoomIn();
那么这可能就是你得到的结果 - 首次尝试取消引用this
指针时出现分段错误,其值为null
。