QEvent所有权

时间:2015-06-17 14:59:08

标签: c++ qt memory-management

我想将预定义和自定义QEvent发送到Qt应用程序。 是否需要在堆上分配事件,还是只需将指针传递给堆栈中的对象?

QKeyEvent stackevent(QEvent::KeyPress);
QKeyEvent* heapevent = new QKeyEvent(QEvent::KeyPress);

QEvent * event;
event = &stackevent; //valid ??
event = heapevent;
QCoreApplication()->notify(someobj, event);
delete heapevent; //valid? or lost ownership?

1 个答案:

答案 0 :(得分:4)

  

event =& stackevent; //有效??

通常这不安全,但在这种情况下它是有效的,因为函数notify不会返回,直到事件被某人处理(或不处理)这意味着stackevent将在这个操作中活着"。

  

删除heapevent; //有效?或失去所有权?

是的,这也是有效的,因为通常没有人应该持有指向QEvent的指针(并且当然要删除它),顺便说一下它已经被处理了。

使用postEvent时情况显着会发生变化:

  

事件必须在堆上分配,因为事件后队列将获取事件的所有权并在发布后将其删除。在发布事件后访问该事件是不安全的。

嗯,我想它更适合在您的情况下使用堆栈分配并在出现任何可能的问题时将指针传递给它(内存会自动释放)。