我遇到了一些由访问引起的段错误问题 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
并立即获得段错误。
移动了变量(以防其他东西被覆盖
它的位置),更改为使用带有 malloc
d 内存的指针,移动
它进入一个单独的结构,将它移动到一个单独的类中(在构造函数中都有一个成员实例和一个带有 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/