Russian Qt Forum

Qt => Общие вопросы => Тема начата: OKTA от Ноябрь 21, 2013, 17:19



Название: Вызов деструктора
Отправлено: OKTA от Ноябрь 21, 2013, 17:19
Товарищи! Объясните пожалуйста! Почему в такой схеме, вроде простой на первый взгляд, сообщение DESTROYED то выводится в дебаг, то не выводится?

main.cpp
Код:
#include <QtGui/QApplication>
#include "mainwindow.h"
#include "mainy.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    mainy *mn = new mainy(&a);

    return a.exec();
}

mainy.h
Код:
#ifndef MAINY_H
#define MAINY_H

#include <QObject>
#include <QDebug>

class mainy : public QObject
{
    Q_OBJECT
public:
    explicit mainy(QObject *parent = 0);
    ~mainy();

public slots:
};

#endif // MAINY_H

mainy.cpp
Код:
#include "mainy.h"

mainy::mainy(QObject *parent) :
    QObject(parent)
{
}

mainy::~mainy() {
    //

    qDebug() << "DESTROYED";
}


Название: Re: Вызов деструктора
Отправлено: Majestio от Ноябрь 21, 2013, 17:29
Попробуй так:
Код:
mainy *mn = new mainy(&w);


Название: Re: Вызов деструктора
Отправлено: OKTA от Ноябрь 21, 2013, 17:31
the same  :-\


Название: Re: Вызов деструктора
Отправлено: mutineer от Ноябрь 21, 2013, 17:38
А как приложение завершаешь?


Название: Re: Вызов деструктора
Отправлено: Majestio от Ноябрь 21, 2013, 17:40
the same  :-\

Объяви внутри конструктора главного окна. По идее так правильнее.


Название: Re: Вызов деструктора
Отправлено: OKTA от Ноябрь 21, 2013, 17:44
А как приложение завершаешь?
да просто крестиком окошко закрываю)


Название: Re: Вызов деструктора
Отправлено: OKTA от Ноябрь 21, 2013, 17:45
the same  :-\

Объяви внутри конструктора главного окна. По идее так правильнее.
Не особо похоже на правильность)


Название: Re: Вызов деструктора
Отправлено: Majestio от Ноябрь 21, 2013, 18:07
Не особо похоже на правильность)

Вот не надо ля-ля

Код:
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    Mainy *May = new Mainy(this);
}

100%-й вызов деструктора при закрытии


Название: Re: Вызов деструктора
Отправлено: OKTA от Ноябрь 21, 2013, 18:33
ну не создавать же мне все объекты в mainwindow теперь?))


Название: Re: Вызов деструктора
Отправлено: Majestio от Ноябрь 21, 2013, 19:17
ну не создавать же мне все объекты в mainwindow теперь?))

Ради интереса попробовал самый первый вариант.
Тож из 15 запусков - 15 выводов.

Разница только в 1 "лишней" строчке:
Код:
class Mainy : public QObject
{
    Q_OBJECT
public:
    explicit Mainy(QObject *parent = 0);
    ~Mainy();

signals:

public slots:

};


Название: Re: Вызов деструктора
Отправлено: Old от Ноябрь 21, 2013, 19:29
Вы про строку signals?
Она ничего не дает, в данном случае.


Название: Re: Вызов деструктора
Отправлено: Majestio от Ноябрь 21, 2013, 19:37
Вы про строку signals?
Она ничего не дает, в данном случае.

Ну да. Я просто сравнил - это единственное отличие. У меня все отрабатывает на ура.


Название: Re: Вызов деструктора
Отправлено: Old от Ноябрь 21, 2013, 19:48
Ну да. Я просто сравнил - это единственное отличие. У меня все отрабатывает на ура.
Уберите ее, все будет продолжать работать.


Название: Re: Вызов деструктора
Отправлено: Majestio от Ноябрь 21, 2013, 19:59
Уберите ее, все будет продолжать работать.

Будет работать, я в курсе :)


Название: Re: Вызов деструктора
Отправлено: OKTA от Ноябрь 21, 2013, 20:27
только вот на 4.7.4 то выдает, то не выдает DESTROYED  ???  ???  ???  >:(


Название: Re: Вызов деструктора
Отправлено: Old от Ноябрь 21, 2013, 20:32
только вот на 4.7.4 то выдает, то не выдает DESTROYED  ???  ???  ???  >:(
А если в конце qDebug добавить << flush?


Название: Re: Вызов деструктора
Отправлено: OKTA от Ноябрь 21, 2013, 20:34
только вот на 4.7.4 то выдает, то не выдает DESTROYED  ???  ???  ???  >:(
А если в конце qDebug добавить << flush?
Без изменений...  :-\


Название: Re: Вызов деструктора
Отправлено: Old от Ноябрь 21, 2013, 20:36
А как это проявляется?


Название: Re: Вызов деструктора
Отправлено: OKTA от Ноябрь 21, 2013, 20:41
ну так же, то есть в консоли фраза, то нет  ???


Название: Re: Вызов деструктора
Отправлено: Old от Ноябрь 21, 2013, 20:43
Попробуйте другой способ индикации. Например, создавайте файл.
Деструктор должен вызываться.


Название: Re: Вызов деструктора
Отправлено: Majestio от Ноябрь 21, 2013, 20:45
Без изменений...  :-\

Для чистоты эксперимента добавьте (я про Qt 5.0.1, у вас там может быть иначе):

Код:
// .h - file
void myMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg);

// .cpp - file
void myMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QFile outFile(QCoreApplication::applicationDirPath()+"\\"+QCoreApplication::applicationName()+".log");
    outFile.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream ts(&outFile);
    ts << QDateTime::currentDateTime().toString("dd/MM/yyyy (HH:mm:ss) : ") << msg << endl;
    if (type == QtFatalMsg) abort();
}

// in main() { }

qInstallMessageHandler(myMessageHandler);
w.show();
return a.exec();

Посмотрите, будет ли дебаг выливаться в файл.


Название: Re: Вызов деструктора
Отправлено: OKTA от Ноябрь 21, 2013, 20:52
Да, с файлом все работает)) Спасибо)) меньше буду верить просто qDebug Впредь))))  :D


Название: Re: Вызов деструктора
Отправлено: Majestio от Ноябрь 21, 2013, 20:58
Да незашта. Но ситуация странная.


Название: Re: Вызов деструктора
Отправлено: ViTech от Ноябрь 22, 2013, 00:11
А если так в деструкторе написать, тоже не всегда выводит?
Код
C++ (Qt)
mainy::~mainy() {
   //
   qDebug("DESTROYED");
}
И то же самое, но не подключая <QDebug>.


Название: Re: Вызов деструктора
Отправлено: Alex Custov от Ноябрь 22, 2013, 13:14
попробуй setbuf(stderr, 0); в начале main()


Название: Re: Вызов деструктора
Отправлено: OKTA от Ноябрь 22, 2013, 20:04
ни так, ни так не помогает  :D
у меня такое ощущение, что это связано с отсутствием у qDebug штуки flush. Может такое быть?


Название: Re: Вызов деструктора
Отправлено: OKTA от Ноябрь 22, 2013, 20:06
std::cout отрабатывает как надо


Название: Re: Вызов деструктора
Отправлено: Majestio от Ноябрь 23, 2013, 12:17
Ради интереса, попробуй еще вот так:

qDebug() << "Message" << endl;

Кстати, в инете пролетали подобные жалобы.
Мож имеет смысл на Qt 5.x переходить? (5.1.1 не советую, пока стабильная 5.0.1)