北京建设规划许可证网站,高端网站设计上海网站建设上海,最新四川成都2新增确诊,深圳市光明区住房和建设局网站如果没有智能指针#xff0c;程序员必须保证new对象能在正确的时机delete#xff0c;四处编写异常捕获代码以释放资源#xff0c;而智能指针则可以在退出作用域时(不管是正常流程离开或是因异常离开)总调用delete来析构在堆上动态分配的对象。 来看看一个野指针例子 程序将会… 如果没有智能指针程序员必须保证new对象能在正确的时机delete四处编写异常捕获代码以释放资源而智能指针则可以在退出作用域时(不管是正常流程离开或是因异常离开)总调用delete来析构在堆上动态分配的对象。 来看看一个野指针例子 程序将会异常结束因为delete view 后 label也被delete了 QPointer作为一个模板类它有很类似与普通的指针它会动态监视分配空间的对象是否被delete 了。它保存了一个QObject 的指针并把这个指针的指针交给全局变量处理在对象销毁时会调用 QObjectPrivate::clearGuards() 函数把双指针置为零所以可以使用 QPointer::isNull() 判断是否已经被销毁。它不是线程安全的。该类在QT4被废弃了但QT5又重写了 看看局部变量当show函数结束时并没有堆widget删除导致内存溢出 QSharedPointer 行为最接近原始指针是最像指针的智能指针 与 QScopedPointer 一样包装了new操作符在堆上分配的动态对象但它实现的是引用计数型的智能指针 可以被自由地拷贝和赋值在任意的地方共享它当没有代码使用引用计数为0它时才删除被包装的动态分配的对象。实现了引用计数的可共享资源的强类型指针它是线程安全的。它不能转让所有权。运行后widget界面将会一闪而过因为它已经在show()作用域结束时被销毁了 QWeakPointer它实现了引用计数的可共享资源的弱类它是线程安全的。在它所指向的资源的所有权期间允许外界释放其资源从而使其放弃所有权它更像是 QSharedPointer 的助手。在QT4它比QPointer更加高效但是在QT5它被废弃啦你不应该继续使用它 QScopedPointer实现了非引用计数的独享资源的强类型指针它是线程安全的。它的所有权不能转让因为它的拷贝和赋值都是私有的 QScopedArrayPointer派生自 QScopedPointer 它存储的是指向动态分配的对象指针默认使用的是 delete [] 释放 QSharedDataPointer可以指向一个隐式共享类对象。QSharedDataPointerT你可以很容易的实现自己的隐式共享类QSharedDataPointer实现了线程安全的引用计数从而保证了你自己写的可重入的隐式共享类不会因为加入QSharedDataPointer而变得不可重入。隐式共享应用在很多Qt类中实现了速率和内存效率的有效结合 EmployeeData 必需继承自QSharedDataQSharedData类是共享数据的基类它提供引用计数它只有默认的构造函数拷贝构造函数和析构函数一般情况下我们有必要自己重写这几个函数。Employee数据成员只有一个QSharedDataPointerEmployeeData指针所以对d访问必须通过-方法。当我们需要改变d的数据时如果d的引用计数大于1的话将会调用detach()对d进行拷贝生成新的对象。从而保证了所以对d的改变不会影响到别的引用。Employee对象被拷贝、用于赋值或者当成参数传递时QSharedDataPointer指针的引用技术自动增加1Employee对象被销毁或者超出作用域时QSharedDataPointer指针的引用计数将自动减小1.当QSharedDataPointer引用计数为0时将自动销毁。
它是深拷贝的 自动垃圾回收 t 对象清理器是实现自动垃圾回收的很重要的一部分。QObjectCleanupHandler可以注册很多子对象并在自己删除的时候自动删除所有子对象。同时它也可以识别出是否有子对象被删 除从而将其从它的子对象列表中删除。这个类可以用于不在同一层次中的类的清理操作例如当按钮按下时需要关闭很多窗口由于窗口的 parent 属性不可能设置为别的窗口的 button此时使用这个类就会相当方便。