Загадочный SIGABRT в деструкторе, если определенные переменные-члены инициализируются в конструкторе - PullRequest
1 голос
/ 09 мая 2011

У меня есть следующий класс 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 ]

3 голосов
/ 09 мая 2011

Добавление этих переменных переместило код вокруг. Где-то есть ошибка, которая не вызывала видимых проблем, пока не произошла перестановка. Я бы запустил его в отладчике или добавил бы к нему логи, чтобы определить, в чем проблема. Используйте метод «Разделяй и властвуй», чтобы минимизировать время нахождения ошибки.

3 голосов
/ 09 мая 2011

Вы проверили файл ядра, чтобы увидеть, где он умер?

При этом наиболее вероятным сценарием является деление на ноль и / или утверждение, что X и Y не равны нулю.

РЕДАКТИРОВАТЬ: Также вероятно, что когда вы не инициализируете значения, программа ведет себя неправильно, но просто выглядит , чтобы работать правильно / лучше.

EDIT2 в ответ на комментарий: Вы можете настроить системы unix / linux (с coreadm), чтобы оставить «основной» файл после сбоя или прерывания программы. Он содержит информацию о стеке вызовов, регистрах, памяти и т. Д. Похоже, что вы нашли его (или что-то подобное). Строка с надписью

free (): неверный следующий размер (быстрый): 0x00000000006e3110 *

на самом деле заставляет меня передумать. Похоже, что ваша куча повреждена, и удаление делает ее видимой. Одна возможность состоит в том, что вы удалили объект дважды. Если вы работаете в Linux, вероятно, valgrind будет вашим лучшим способом выяснить, что произошло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...