神秘SIGABRT如果某些成员变量在构造函数初始化
问题描述:
我有以下的Qt类:神秘SIGABRT如果某些成员变量在构造函数初始化
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
?
堆栈跟踪
答
你检查的核心文件,看看它死了?
那说,最可能的情况是除以零和/或断言X和Y都不为零。
编辑:此外它似乎很可能,当你不初始化的值程序行为错误,但它只是出现正常/更好地工作。
EDIT2回应评论:您可以配置unix/linux系统(使用coreadm
)在程序崩溃或中止时留下“核心”文件。它包含有关调用堆栈,寄存器,内存等的信息。它看起来似乎找到了它(或类似的东西)。上面写着
免费线():无效的下一个尺寸(快速): 0x00000000006e3110 *
实际上使我改变了主意。它看起来像你的堆已损坏,并且删除导致它变得可见。一种可能性是你删除了对象两次。如果你在Linux上,valgrind可能是你找出发生的事情的最好方法。
答
添加这些变量四处移动代码。在发生重排之前,有一个地方没有引起明显问题。我会在调试器中运行它,或者添加日志记录来确定问题出在哪里。使用“分而治之”的方法来最小化发现错误的时间。
有了这样的问题,你应该表现出更多的代码,错误不可能在你的例子转载。真正的错误可能在代码中的任何地方。添加这些特定行使程序崩溃的事实并不意味着代码中的错误与这些行相关。 – rohanpm 2011-05-09 22:32:56