QEvent所有权
QEvent ownership
我想将预定义和自定义 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?
event = &stackevent; //valid ??
通常这是不安全的,但在这种情况下它是有效的,因为函数 notify
不会 return,直到事件被某人处理(或不被处理)(这意味着 stackevent
在此操作期间将是 "alive")。
delete heapevent; //valid? or lost ownership?
是的,这也是有效的,因为通常没有人应该持有指向 QEvent 的指针(当然要删除它),顺便说一句,它已经被处理过了。
当使用 postEvent
时,情况 显着 改变:
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.
嗯,我想在你的情况下使用堆栈分配并传递一个指向它的指针更适合,以防出现任何可能的问题(内存将自动释放)。
我想将预定义和自定义 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?
event = &stackevent; //valid ??
通常这是不安全的,但在这种情况下它是有效的,因为函数 notify
不会 return,直到事件被某人处理(或不被处理)(这意味着 stackevent
在此操作期间将是 "alive")。
delete heapevent; //valid? or lost ownership?
是的,这也是有效的,因为通常没有人应该持有指向 QEvent 的指针(当然要删除它),顺便说一句,它已经被处理过了。
当使用 postEvent
时,情况 显着 改变:
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.
嗯,我想在你的情况下使用堆栈分配并传递一个指向它的指针更适合,以防出现任何可能的问题(内存将自动释放)。