Russian Qt Forum

Qt => Общие вопросы => Тема начата: call_me_frank от Июнь 04, 2014, 12:38



Название: грамотное деструктирование :)
Отправлено: call_me_frank от Июнь 04, 2014, 12:38
работаю с почтовыми протоколами через сокеты.

есть класс почтового ящика и два класса протоколов (содержащих сокеты), которые работают каждый в своем потоке.

потоки, как и объекты протоколов создаются в конструкторе ящика, и после этого протоколы кидаются в потоки через moveToThread.

в двух словах:

Код:
MB::MB () { 

    imap = new Imap(email, pwd);
    ith = new QThread(this);
    imap->moveToThread(ith);
    ith->start();

}

проблемы возникают при уничтожении объекта почтового ящика. программа вылетает - в 3 случаях из десяти, но это недопустимо. много вариантов перепробовано, но 100% надежный так и не найден.

деструктор ящика:
Код:
MB::~MB(){
    //

    qDebug() << "~MBX";

    sth->quit();
    sth->wait();

    ith->quit();
    ith->wait();

    delete smtp;
    delete imap;
}

деструктор протокола:
Код:
Imap::~Imap() {
    //

    qDebug() << "~IMAP";

    socket->close();
    socket->deleteLater();

    this->deleteLater();
}

ящик удаляется через delete mb;

вопрос, как все-таки составить деструктор ящика, протокола, как правильно закрывать и удалять сокет и как удалять сам ящик, чтобы вся эта связка работала как часы и не заставляла пользователей нервничать, становясь причиной аварийного завершения программы?


Название: Re: грамотное деструктирование :)
Отправлено: lit-uriy от Июнь 04, 2014, 13:39
this->deleteLater(); - явно лишнее, ты уже в деструкторе, а  значит уже удаляется объект.

socket->deleteLater(); - если сокет создан в конструкторе этого объекта, то яно его и удаляй.


Название: Re: грамотное деструктирование :)
Отправлено: call_me_frank от Июнь 04, 2014, 17:10
спасибо! буду тестить и учиться )