我遇到一些问题,因为访问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.
| 归档时间: |
|
| 查看次数: |
6000 次 |
| 最近记录: |