析构函数中的神秘SIGABRT,如果在构造函数中初始化了某些成员变量

时间:2011-05-09 15:14:05

标签: c++ qt opengl

我有以下Qt课程:

class GLWidget : public QGLWidget
{
    Q_OBJECT
public:
    GLWidget(QWidget *parent = 0);
private:
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();

    double posX;
    double posY;
    double posZ;
};

当我把它放在构造函数中时,我的程序在SIGABRT期间产生GLWidget::~GLWidget

this->posX = 0.0;
this->posY = 0.0;
this->posZ = 1.0;

这些成员变量不会在班级的任何其他地方使用。如果我没有初始化成员变量,程序就不会失败。这怎么会导致SIGABRT

堆栈跟踪

Stack trace

2 个答案:

答案 0 :(得分:3)

您是否检查了核心文件以查看其死亡位置?

尽管如此,最可能的情况是除以零和/或断言X和Y不为零。

编辑:当你没有初始化值时,程序可能会出现错误,但只是出现才能正常/更好地工作。

EDIT2回复评论:您可以配置unix / linux系统(使用coreadm),以便在编程崩溃或中止时留下“核心”文件。它包含有关调用堆栈,寄存器,内存等的信息。看起来您确实找到了它(或类似的东西)。该行

  

free():下一个尺寸无效(快):   0x00000000006e3110 *

实际上让我改变主意。看起来你的堆已损坏,删除导致它变得可见。一种可能性是您删除了两次对象。如果你在Linux上,valgrind可能是你弄清楚发生了什么的最好方法。

答案 1 :(得分:3)

添加这些变量可以移动代码。在重新排列发生之前,某个地方有一个没有引起明显问题的错误。我会在调试器中运行它或添加日志记录来确定问题所在。使用“分而治之”方法可以最大限度地减少发现错误的时间。