c++ - 如果某些成员变量在构造函数中初始化,则析构函数中出现神秘的 SIGABRT

标签 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;
};

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

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

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

堆栈跟踪

Stack trace

最佳答案

您是否检查了核心文件以查看它死在哪里?

也就是说,最可能的情况是除以零和/或断言 X 和 Y 不为零。

编辑:另外,当您不初始化这些值时,程序似乎可能会出现错误,但它只是看起来可以正常/更好地工作。

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

free(): invalid next size (fast): 0x00000000006e3110 *

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

关于c++ - 如果某些成员变量在构造函数中初始化,则析构函数中出现神秘的 SIGABRT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5938885/

相关文章:

c++ - VS 2017 不会隐式地将 const char* 转换为 char*

c++ - Qt creator C++,设置Statuslabel的文本

c++ - 在 OpenGL 中更新模板缓冲区时出现问题

c++ - 简单地包含 SDL header 会导致链接器错误

c++ - visual studio 2010 c++调试符号已加载但找不到源代码

C++ 更快的字符数组比较

c++ - 比较分别从容器中获取的迭代器是否有效?

工具按钮下的Qt设置文本

qt - 下载时出错

python - 小狗。如何动态更改顶点的图片(动画)。 OpenGL