2014-05-15 72 views
-1

我张贴的事件与此代码:异常安全保障::事件后

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

QCoreApplication ::事件后描述here。但是,如果在postEvent中引发异常,绝对没有关于我应该做什么的信息。

我想功能属于这一四类之一:

  1. 如果它抛出它永远不会删除事件它永远不会抛出一个异常(没有的std :: bad_alloc的特别)
  2. 如果它抛出它会有时候删除事件。
  3. 如果抛出它会一直删除事件。

最坏的情况下将成为第三。

所以:我需要的,如果事件后抛出删除事件?

回答

2

我已经找到了QApplication的事件后::代码:

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后卫例外的情况下破坏事件。

我猜的答案,我的问题是第四个选择:

如果它抛出,它会永远删除给定的事件。