1、deleteLater()
deleteLater()会让所有事件都发送完一切处理好后才清除内存,而且就算调用多次的deletelater也是安全的。
void QObject::deleteLater()
{
QCoreApplication::postEvent(this, new QDeferredDeleteEvent());
}
bool QObject::event(QEvent *e)
{
switch (e->type()) {
......
case QEvent::DeferredDelete:
qDeleteInEventHandler(this);
break;
}
}
void qDeleteInEventHandler(QObject *o)
{
delete o;
}
从源码可以看到,返回到事件循环后,调用deleteLater()
的对象才会被销毁,否则不执行。
2、qDeleteAll与clear
template <typename ForwardIterator>
Q_OUTOFLINE_TEMPLATE void qDeleteAll(ForwardIterator begin, ForwardIterator end)
{
while (begin != end) {
delete *begin;
++begin;
}
}
template <typename Container>
inline void qDeleteAll(const Container &c)
{
qDeleteAll(c.begin(), c.end());
}
当T的类型为指针时,调用clear方法能置空,但并不能释放其内存。qDeleteAll可以释放容器元素内存,但没有对容器的置空操作,也就是size没变。所以qDeleteAll之后必须加上clear方法。