Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: like-nix от Март 18, 2011, 00:01



Название: Краш
Отправлено: like-nix от Март 18, 2011, 00:01
Проблема однако =)

Код:
#include <QtGui/QApplication>
#include <QDialog>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include "mainwindow.h"
#include "DialogOptionsDbConnection.h"
#include "App.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QSqlError err = App::Inst().database().connectToDatabase();
    if(QSqlError::NoError != err.type())
    {
        QDialog dlg;

        QPushButton cancelButton("Cancel");
        a.connect(&cancelButton, SIGNAL(clicked()),
                &dlg, SLOT(reject()));

        QPushButton okButton("OK");
        okButton.setDefault(true);
        a.connect(&okButton, SIGNAL(clicked()),
                &dlg, SLOT(accept()));

        QHBoxLayout layoutButtons;
        layoutButtons.addWidget(&okButton);
        layoutButtons.addWidget(&cancelButton);

        QVBoxLayout layoutDialog;
        ConfigureSQL conn;
        layoutDialog.addWidget(&conn);
        layoutDialog.addLayout(&layoutButtons);

        dlg.setLayout(&layoutDialog);

        do
        {
            dlg.exec();
            if(dlg.result() != QDialog::Accepted)
            {
                exit(1);
            }
            err = App::Inst().database().lastError();
        }
        while(QSqlError::NoError != err.type());
    }
    MainWindow w;
    w.show();

    return a.exec();
}

жестко падает =) при выходе из блока if(QSqlError::NoError != err.type())
Вот ошибка

И подскажите пожалуйста если я буду использовать указатели вместо объектов
cancelButton, okButton, layoutButtons, layoutDialog, ConfigureSQL буду использовать указатели их надо принудительно удалять?

И вообще какие классы в Qt нужно принудительно удалять, а какие лучше использовать в качестве объектов, а какие как указатели?


Название: Re: Краш
Отправлено: like-nix от Март 18, 2011, 00:06
ancelButton, okButton, layoutButtons, layoutDialog, ConfigureSQL заменил на указатели стало хорошо =) Сижу думаю как там утечки памяти =)

Может кто подскажет как в Qt утечки памяти посмотреть проще всего замарачиваться особо нет времени.


Название: Re: Краш
Отправлено: like-nix от Март 18, 2011, 00:06
Или может smart pointers использовать?


Название: Re: Краш
Отправлено: alexman от Март 18, 2011, 00:11
BoundsChecker


Название: Re: Краш
Отправлено: Пантер от Март 18, 2011, 08:23
Возможно я еще не проснулся, но ошибку в коде я не нашел, все должно работать.

Утечки можно посмотреть valgrind'ом под Линуксом.


Название: Re: Краш
Отправлено: GreatSnake от Март 18, 2011, 11:06
Цитировать
Сижу думаю как там утечки памяти =)
А стоит ли об этом думать, коли аллокация делается в main()?
Или вопрос обо всех утечках?


Название: Re: Краш
Отправлено: like-nix от Март 18, 2011, 13:17
Да обо всех в челом. Я не нашел в документации нормального описания сборщика муссора который работает в Qt.


Название: Re: Краш
Отправлено: GreatSnake от Март 18, 2011, 13:20
Цитата: like-nix
Да обо всех в челом. Я не нашел в документации нормального описания сборщика муссора который работает в Qt.
Сборщик мусора в C++?  :o


Название: Re: Краш
Отправлено: like-nix от Март 18, 2011, 13:25
Ну у них все примеры написаны без единого гвоздя(delete) почти =) И опенсорсных проектах такая практика очень часто встречается, все либо забивают на освобождение либо... он есть =)


Название: Re: Краш
Отправлено: Пантер от Март 18, 2011, 13:26
В Qt все решают родительские связи. Если назначаешь парента, то будь уверен, что он сам убьет своего ребенка.


Название: Re: Краш
Отправлено: like-nix от Март 18, 2011, 13:28
А кто родителя убивает? =)


Название: Re: Краш
Отправлено: GreatSnake от Март 18, 2011, 13:29
Цитировать
Ну у них все примеры написаны без единого гвоздя(delete) почти =) И опенсорсных проектах такая практика очень часто встречается, все либо забивают на освобождение либо... он есть =)
В Qt используется иерархическая модель "родитель-потомки". При удалении родителя сам родитель удаляет своих потомков.
Если придерживаться этой модели, то delete-ом пользоваться практически не придётся. Что и показывают примеры.


Название: Re: Краш
Отправлено: Пантер от Март 18, 2011, 13:30
А кто родителя убивает? =)
Его родитель или ты.


Название: Re: Краш
Отправлено: like-nix от Март 18, 2011, 13:33
Да теперь ясно)


Название: Re: Краш
Отправлено: GreatSnake от Март 18, 2011, 13:35
А кто родителя убивает? =)
Его родитель или ты.
Либо сам C++, если родительский класс (MainWindow, Dialog) создан на стеке в main().
Либо сам Qt, если виджет имеет атрибут Qt::WA_DeleteOnClose.


Название: Re: Краш
Отправлено: GreatSnake от Март 18, 2011, 13:37
2 Пантер:
больно быстро печатаешь ;)


Название: Re: Краш
Отправлено: Пантер от Март 18, 2011, 14:03
Не, я медленно печатаю. Просто как модератор могу время на форуме замедлять.


Название: Re: Краш
Отправлено: Racheengel от Март 19, 2011, 14:29
а что есть #include "App.h" ?