1 01_QT内存管理
目录
1.1 01_QScopedPointer
1.1.1 01_概念
概念。
QScopedPointer 是 Qt 提供的一种智能指针, 用于管理动态分配的内存, 并在不再需要时自动释放资源。 它的主要作用是提供一种安全的方式 来处理动态分配的对象, 避免了手动管理内存带来的内存泄漏和野指针等问题。 QScopedPointer 的核心原理在于 它使用 RAII Resource Acquisition Is Initialization 模式 来确保对象的生命周期与范围一致。 当 QScopedPointer 对象离开作用域时 即程序执行到该对象所在的作用域之外, 会自动调用析构函数, 从而释放分配给对象的内存。
1.1.2 02_特点
特点。
QScopedPointer 有以下特点: 自动管理资源: QScopedPointer 会在其生命周期结束时 即离开作用域或显式调用 reset方法自动删除所管理的对象。 这避免了手动调用 delete 的必要性, 并且在对象不再需要时能确保内存被正确释放, 从而防止内存泄漏。 类型安全: QScopedPointer 只能用于指向特定类型的指针, 因此不能意外地使用错误的类型。 这提高了代码的安全性和可维护性。 构造和析构: 当 QScopedPointer 的对象被创建时, 会调用该对象的构造函数; 当 QScopedPointer 对象离开作用域或显式调用 reset方法时, 会调用对象的析构函数。 这确保了资源在使用完毕后得到适当的清理。 通过使用 QScopedPointer, 开发者可以更安全、 更简洁地管理动态分配的对象, 减少内存管理相关的错误, 并提高代码的可读性和可靠性。
1.1.3 03_实践
实践。
范围指针类型 QScopedPointer。 超出范围指针变量的作用范围时, 所包含的原始指针指向的对象 将自动调用析构函数进行销毁。 在作用范围A中, 定义了三个范围指针pa、pb、pc。 当超出变量作用范围时, pa、pb、pc中包含的原始指针 指向的对象, 将自动调用析构函数进行销毁。 在pa、pb、pc都在相同的作用范围的情况下, 析构函数的调用次序和构造函数的调用次序恰好相反。 在作用范围B中, 定义了嵌套的作用范围C。 在作用范围C中, 定义了嵌套的作用范围D。 作用范围B、C、D的生命周期比较如下, B的生命周期长于C, C的生命周期长于D。 pd、pe、pf这几个范围指针, 分别在作用范围D、C、B中。 它们指向的对象的销毁次序从先往后依次是 pd、pe、pf。
1.2 02_QSharedPointer
1.2.1 01_概念
概念。
QSharedPointer 是 Qt 库中用于管理对象所有权的智能指针之一。 它允许两个或更多 QSharedPointer 实例 共享对同一对象的所有权, 从而在多个地方使用同一个对象实例 而无需担心内存泄漏。
1.2.2 02_特点
特点。
QSharedPointer 的主要作用是: 所有权管理: 当一个 QSharedPointer 指向的对象 不再被任何其他 QSharedPointer 引用时, 即所有指向该对象的 QSharedPointer 都变为空, 它会自动调用对象的析构函数, 从而释放分配给该对象的内存。 这确保了资源的有效管理。 避免重复创建: QSharedPointer 可以在多个地方共享同一个对象实例, 这意味着不需要在每个需要使 用该对象的地方都创建一个新的实例。 这有助于减少内存消耗和提高程序性能。 线程安全: QSharedPointer 在多线程环境中是线程安全的, 可以用于跨线程之间的数据共享。 自动解引用: 当 QSharedPointer 对象自身变为空, 即指向的对象被删除, 则表示该对象已不再可用。 此时, 任何依赖于该 QSharedPointer 的代码 都会知道该对象已经不存在, 并且可以采取适当的措施。 QSharedPointer 通过内部维护一个计数器 来跟踪对同一对象的引用数量。 当创建一个新的 QSharedPointer 对象时, 计数器增加; 当 QSharedPointer 对象被销毁或解引用时, 计数器减少。 当计数器变为零时, 表示没有更多的引用指向该对象, 于是对象会被删除并释放内存。 总之, QSharedPointer 是一个强大的工具, 用于在多线程和跨多个代码路径的场景中安全、 高效地管理资源。
1.2.3 03_实践
实践。
数据类型A, 定义了构造函数和析构函数。 使用QSharedPointer定义了几个变量 spa、spb、spc。 这些变量都是共享指针变量, 都指向A的同一个对象实例。 QSharedPointer内部使用引用计数 维护对象的生命周期。 当指向同一个对象实例的共享指针变量 都重置为空或者超出作用范围时, 内部引用计数降低到0, 指向的对象实例才会调用析构函数销毁。
1.3 03_QWeakPointer
1.3.1 01_概念
概念。
在Qt编程技术领域中, QWeakPointer 是一个用于管理对象所有权的轻量级工具, 它允许程序员在不直接持有对象所有权的情况下, 仍然能够访问该对象。 与强引用如QObject类中的成员变量不同, 弱引用不会增加被引用对象的引用计数。
1.3.2 02_特点
特点。
生命周期独立性: 当一个对象通过QWeakPointer被引用时, 它的生命周期并不依赖于引用它的地方。 这意味着即使在某个时刻 没有直接或间接的强引用指向该对象, 只要还有其他QWeakPointer引用存在, 对象仍然可以保持其状态和数据。 内存管理: QWeakPointer有助于避免内存泄漏。 当一个对象不再被任何强引用所持有时 包括通过QWeakPointer, Qt的垃圾回收机制 会自动释放这个对象占用的内存空间。 循环引用问题: 在使用强引用时, 如果两个或多个对象互相引用对方, 可能会导致循环引用的问题, 从而阻止垃圾回收。 而QWeakPointer可以避免这种情况, 因为即使一个对象被另一个对象 通过QWeakPointer间接引用, 只要没有直接的强引用存在, 该对象仍然会被垃圾回收。 总之, QWeakPointer 是Qt中用于更安全地管理和使用对象的一种工具, 尤其适用于需要处理大量对象、 避免内存泄漏和循环引用场景的复杂应用。
1.3.3 03_实践
实践。
使用QSharedPointer表示强引用指针。 使用QWeakPointer表示弱引用指针。 从强引用指针可以构造出弱引用指针。 调用弱引用指针类型的lock函数 可以重新取得强引用指针。 只能通过强引用指针访问原始对象, 无法通过弱引用指针直接访问原始对象。