美文网首页
QT内存知识点

QT内存知识点

作者: 行走的代码 | 来源:发表于2020-02-05 16:07 被阅读0次

问题:为什么用deleteLater

20190117213922197.png
deletelater的原理是 QObject::deleteLater()并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象
由于事件队列中可能有引用该对象的地方,当deleteLater调用时,队列中引用该对象的事件会从队列中移除,从而确保最后释放对象时是安全的。

Qt半自动的内存管理:

在Qt中,以下情况下你new出的对象你可以不用亲自去delete:

  1. QObject及其派生类的对象,如果其parent非0,那么其parent析构时会析构该对象。
    原因:在Qt中,每个 QObject 内部都有一个list,用来保存所有的 children,还有一个指针,保存自己的parent。当它自己析构时,它会将自己从parent的列表中删除,并且析构掉所有的children。
  2. 有些类的对象可以接收设置一些特别的标记,比如:
    QWidget及其派生类的对象,可以设置 Qt::WA_DeleteOnClose 标志位(当close时会析构该对象)
    QAbstractAnimation派生类的对象,可以设置 QAbstractAnimation::DeleteWhenStopped
    QRunnable::setAutoDelete()
    MediaSource::setAutoDelete()
    ...

自动释放内存触发崩溃的实例:

实例1

#include <QApplication>
#include <QLabel>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel label("Hello Qt!");
label.show();
label.setAttribute(Qt::WA_DeleteOnClose);
return app.exec();
}

运行正常,退出时会崩溃 ,因为label被close时,将会 delete 这儿label对象,但label对象却不是通过new分配到heap中的。
为了使得用户减少自己显式使用delete,Qt将delete隐藏的比较深。这样一来,不使用new为对象分配空间时,反倒需要多多小心了。

实例2

#include <QtGui>
int main(int argc, char* argv[])
{
   QApplication app(argc, argv);
   QLabel label(tr"Hello Qt!");
   QWidget w;
   label.setParent(&w);
   w.show();
   return app.exec();
}

因为退出时,w 比 label 先被析构,当 w 被析构时,会删除chilren列表中的对象,也就是这儿的 label。但 label 却不是通过new分配在heap中,而是在stack中,delte stack中的东西会导致崩溃。

QT内存管理机制:https://www.cnblogs.com/apocelipes/p/9991845.html

相关文章

  • QT内存知识点

    问题:为什么用deleteLater deletelater的原理是 QObject::deleteLater()...

  • QT(内存泄露)

    1 Qt半自动的内存管理 Qt中已下情况new出的对象可以不用亲自去delete: (1)QObject及其派生类...

  • qt 共享内存 单例

    QT 进程间通信之古老的方法(内存共享) 让QT只运行一个实例 以上两篇文章中分别讲述了QSharedMemory...

  • Android 内存泄漏分析

    Android 内存泄漏分析 Hi,这几天应用内存溢出了,所有我学习了下内存溢出相关的知识点,以下的知识点都来自网...

  • QT容器类

    QT容器类,相对于C++的STL容器类,更为小巧、安全和方便使用。QT5在容器类里面做了优化速度、内存、inlin...

  • Qt新学知识点

    1、如何创建QThread;继承Qobject,再手动改写2、如何将Dialog的背景设为一张图片,且不影响其他的...

  • js知识版图-数据类型

    一、js中内存分为栈内存、堆内存此处引申知识点:js中堆栈内存及函数处理机制 栈内存 从数据类型角度思考 栈内存 ...

  • iOS 内存相关的基础知识

    为什么不能直接访问物理内存? 内存不够用。 内存数据不安全。 内存管理方案 相关知识点[https://jueji...

  • iOS课程笔记大全(1)

    (复习) 内存管理:手动内存管理\ARC,内存管理是面试必问的知识点2.Category、Protocol、Blo...

  • QT-内存申请释放

    来自 https://www.cnblogs.com/senior-engineer/p/10037920.html

网友评论

      本文标题:QT内存知识点

      本文链接:https://www.haomeiwen.com/subject/jdmsxhtx.html