Просмотр сообщений
|
Страниц: [1]
|
2
|
Qt / Вопросы новичков / Re: Генерация собственного сообщения QEvent
|
: Январь 20, 2021, 09:10
|
Второе же предложение в документации: The event must be allocated on the heap since the post event queue will take ownership of the event and delete it once it has been posted. It is not safe to access the event after it has been posted.
"posted", я так понимаю, это отправка в очередь событий. Фактически написано, что событие будет удалено после отправления в очередь. Следует читать, что удалено будет после очередного завершения customEvent()?
|
|
|
3
|
Qt / Вопросы новичков / Re: Генерация собственного сообщения QEvent
|
: Январь 20, 2021, 08:59
|
А как же тогда забрать идентификатор потока? Работал такой код: void MainWindow::customEvent(QEvent *event) { if ( event -> type() == THREAD_FINISHED_EVENT ) { ui -> teInfo -> append("Message received, ID=" + QString::number( static_cast<TFinishedEvent *>(event) -> ID() ) ); } } Получается, что если экземпляр будет автоматически удален, то я потеряю доступ к полю id? Или удален экземпляр будет удален только после выхода из customEvent()?
|
|
|
4
|
Qt / Вопросы новичков / Генерация собственного сообщения QEvent
|
: Январь 20, 2021, 08:27
|
Использую несколько потоков тяжелых вычислений, по окончанию расчетов в потоке посылаю главному потоку сообщение (пример подсмотрел, кажется осознал и доработал): const QEvent::Type THREAD_FINISHED_EVENT = static_cast<QEvent::Type>(QEvent::User + 111); class TFinishedEvent : public QEvent { public: TFinishedEvent(const int thread_id) : QEvent ( THREAD_FINISHED_EVENT ), id ( thread_id ) {} void post(QObject *receiver) { QApplication::postEvent( receiver, new TFinishedEvent( id ) ); } int getID() const { return id; } private: int id; };
Вроде работает. Но меня смущает . Куда девается динамически создаваемый экземпляр класса? Остается в куче и создает утечки? Если да, то как сделать грамотно?
|
|
|
5
|
Qt / Вопросы новичков / Re: Как вызываются деструкторы
|
: Январь 20, 2021, 07:32
|
Не вижу примера прямого вызова деструктора. А какой был порыв любознательности, желания все изучить! И сразу потух, и куда все делось? Igors, спасибо за заботу! Удрученный собственным невежеством и обрадованный небольшим его уменьшением удалился изучать матчасть Вон народ книжек посоветовал, изучаю. Пока на вашу задачку не знаю ответа
|
|
|
7
|
Qt / Вопросы новичков / Re: Как вызываются деструкторы
|
: Декабрь 15, 2020, 15:14
|
То есть все статические объекты: объявленные явно как static, либо объявленные вне функций будут уничтожены с вызовом деструктора при завершении программы? В ссылке про вызов деструктора не написано явно, но видимо, так.
|
|
|
13
|
Qt / Вопросы новичков / Re: Как вызываются деструкторы
|
: Декабрь 15, 2020, 12:48
|
Я вот и пытаюсь учить, книжки читаю, но вопросы остаются. 1. Спасибо по п. 1 вроде понял: при удалении родителя все дочерние объекты будут также удалены. 2. Частично понятно из п.1. Про "статически" снялся вопрос. Но в основном непонятно. Я представляю себе так: я создал объект QString s="Abc" Где-то в памяти, наверное, в куче, размещено "Abc". Перед закрытием программы следует очистить память. Для этого нужно явно или неявно вызвать деструктор. QString не является наследником другого объекта QObject (п.1), поэтому следует вызвать деструктор явно. Правильно ли я рассуждаю? 3. Из того, что читал следует, что переменные могут размещаться в отдельном сегменте данных (глобальные переменные), время жизни = времени жизни программы, в стеке (локальные переменные функций и методов) время жизни = времени выполнения функции/метода, в куче там время жизни - пока явно не удалю. Если объект объявлен в методе, он - локальная переменная, все, что его касается, хранится в стеке, правда, он может выделить память в куче. Опять же нужно явно вызывать деструктор получается? 4. Ну да, я не понимаю ни основы C++ ни специфику Qt, пытаюсь разобраться, в книжках ответы не нашел, потому и спрашиваю По моей логике (порочной судя по брезгливому комментарию) надо явно вызвать деструктор MainWindow, в котором освободить всю выделенную под массивы в куче память и вызвать деструкторы всех созданных объектов. Но такой деструктор в изученных мной примерах никто не делает. Очевидно, я где-то не прав, но не понимаю где.
|
|
|
14
|
Qt / Вопросы новичков / Как вызываются деструкторы
|
: Декабрь 15, 2020, 11:22
|
Уважаемые специалисты, я, увы, новичок в C++ и Qt вопрос, как следует вызывать деструкторы 1. Правильно ли я понимаю, что динамически-созданные объекты классов, наследующих QObject, всегда уничтожаются Qt автоматически? Т.е. явно вызывать "delete S;" после "QString S; S = new QString("Abc");..." не нужно? 2. Если я создаю статически, скажем "QString S = "Abc";" как поле класса, то должен в деструкторе класса обязательно написать "S.~QString();" ? 3. Если я объявил "QString S = "Abc";", как локальную переменную метода, то деструктор можно не вызывать, так как объект S будет размещен в стеке и память выделенная S будет освобождена после завершения выполнения метода? 4. Во всех примерах создания оконных приложений: int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow winMain; winMain.show(); return app.exec(); }
Объект MainWindow создается статически, получается, его деструктор не будет вызван никогда? Тогда если полями MainWindow у меня являются динамические массивы, то единственная возможность их удались перед завершением работы приложения - написать слот для сигнала aboutToQuit() QApplication?
|
|
|
|
|