Исключительная гарантия безопасности QCoreApplication :: postEvent

Я публикую событие с этим кодом:

QEvent*event=new QEvent(QEvent::User);
QCoreApplication::postEvent(pointerToSomeQObject,event);

QCoreApplication :: postEvent описывается Вот. Тем не менее, нет абсолютно никакой информации о том, что я должен делать, если в postEvent создается исключение.

Я полагаю, функция попадает в одну из этих четырех категорий:

  1. Он никогда не генерирует исключение (в частности, нет std :: bad_alloc)
  2. Если он выбрасывает, он никогда не удалит событие.
  3. Если он выбрасывает, это когда-нибудь удалит событие.
  4. Если он выбрасывает, он всегда удаляет событие.

В худшем случае будет третий.

Так: мне нужно удалить событие, если выбрасывает postEvent?

-1

Решение

Я нашел код для QApplication :: postEvent:

void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority)
{
if (receiver == 0) {
qWarning("QCoreApplication::postEvent: Unexpected null receiver");
delete event;
return;
}

QThreadData * volatile * pdata = &receiver->d_func()->threadData;
QThreadData *data = *pdata;
if (!data) {
// posting during destruction? just delete the event to prevent a leak
delete event;
return;
}

// lock the post event mutex
data->postEventList.mutex.lock();

// if object has moved to another thread, follow it
while (data != *pdata) {
data->postEventList.mutex.unlock();

data = *pdata;
if (!data) {
// posting during destruction? just delete the event to prevent a leak
delete event;
return;
}

data->postEventList.mutex.lock();
}

QMutexUnlocker locker(&data->postEventList.mutex);

// if this is one of the compressible events, do compression
if (receiver->d_func()->postedEvents
&& self && self->compressEvent(event, receiver, &data->postEventList)) {
return;
}

if (event->type() == QEvent::DeferredDelete && data == QThreadData::current()) {
// remember the current running eventloop for DeferredDelete
// events posted in the receiver's thread
static_cast<QDeferredDeleteEvent *>(event)->level = data->loopLevel;
}

// delete the event on exceptions to protect against memory leaks till the event is
// properly owned in the postEventList
QScopedPointer<QEvent> eventDeleter(event);
data->postEventList.addEvent(QPostEvent(receiver, event, priority));
eventDeleter.take();
event->posted = true;
++receiver->d_func()->postedEvents;
data->canWait = false;
locker.unlock();

QAbstractEventDispatcher* dispatcher = data->eventDispatcher.loadAcquire();
if (dispatcher)
dispatcher->wakeUp();
}

Очень важно уничтожить событие в случае исключения с помощью защиты RAII QScopedPointer.

И я думаю, что ответ на мой вопрос — четвертый выбор:

Если он выбрасывает, он всегда удаляет данное событие.

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector