crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Crash из за QEventLoop::exec()
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
512es Дата 9.1.2012, 16:15
  Спасибо больщушее!

Не пойму как я сам не сообразил..
BRE Дата 9.1.2012, 16:06
  Не нужно указвать parent для объектов создаваемых на стеке.
void MainWindow::slotTest()
{
    Looper r;
    r.execloop();
    qDebug() << "done";
}


Как правило это не вызывет проблем, т.к. объект созданный на стеке в своем деструкторе выпишится из списка своего parent'а. А в данном случае, из-за атрибута Qt::WA_DeleteOnClose, деструктор MainWindow пытался освободить объект созданный на стеке.
512es Дата 9.1.2012, 15:38
  Доброе время суток!

Помогите пожалуйста понять в чём ошибка.

Пример во вложении и тут:

main.cpp
#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow *mainWin = new MainWindow();
    mainWin->show();
    return app.exec();
}


mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui>
#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow();

public slots:
    void slotTest();
};

#endif


mainwindow.cpp
#include "mainwindow.h"
#include "looper.h"

MainWindow::MainWindow()
{
    setAttribute(Qt::WA_DeleteOnClose);
    QMetaObject::invokeMethod(this, "slotTest", Qt::QueuedConnection);
}

void MainWindow::slotTest()
{
    Looper r(this);
    r.execloop();
    qDebug() << "done";
}


looper.h
#ifndef LOOPER_H
#define LOOPER_H

#include <QObject>
#include <QEventLoop>

class Looper : public QObject
{
    Q_OBJECT
public:
    explicit Looper(QObject *parent = 0);
    void execloop();

private:
    QEventLoop loop;
};

#endif // LOOPER_H


looper.cpp
#include <QDebug>
#include "looper.h"

Looper::Looper(QObject *parent) :
    QObject(parent)
{
    qDebug() << "obj" << this;
}

void Looper::execloop()
{
    qDebug() << "start loop";
    loop.exec();
    qDebug() << "end loop";
}


Вывод программы:
obj Looper(0x7fff5fbfe2c0) 
start loop
crash(36249,0x7fff709ffcc0) malloc: *** error for object 0x7fff5fbfe2c0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug


Qt 4.7.4 Mac OS 10.6.8
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 20.4.2024, 17:29