crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Crash из за QEventLoop::exec(), Example inside
512es
  опции профиля:
сообщение 9.1.2012, 15:38
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


Доброе время суток!

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

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

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

Сообщение отредактировал 512es - 9.1.2012, 15:40
Прикрепленные файлы
Прикрепленный файл  crash.zip ( 2.17 килобайт ) Кол-во скачиваний: 52
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 9.1.2012, 16:06
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Не нужно указвать parent для объектов создаваемых на стеке.
void MainWindow::slotTest()
{
    Looper r;
    r.execloop();
    qDebug() << "done";
}


Как правило это не вызывет проблем, т.к. объект созданный на стеке в своем деструкторе выпишится из списка своего parent'а. А в данном случае, из-за атрибута Qt::WA_DeleteOnClose, деструктор MainWindow пытался освободить объект созданный на стеке.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 9.1.2012, 16:15
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

Спасибо сказали: 5 раз(а)




Репутация:   0  


Спасибо больщушее!

Не пойму как я сам не сообразил..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2020, 1:42