QWeakPointer Class
template <typename T> class QWeakPointerQWeakPointer 类持有对共享指针的弱引用。更多
头文件: | #include <QWeakPointer> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
注意:该类中的所有函数都是可重入的。
公共函数
QWeakPointer() | |
QWeakPointer(const QSharedPointer<T> &other) | |
QWeakPointer(const QWeakPointer<T> &other) | |
~QWeakPointer() | |
void | clear() |
bool | isNull() const |
QSharedPointer<T> | lock() const |
(since 6.7) bool | owner_before(const QSharedPointer<X> &other) const |
(since 6.7) bool | owner_before(const QWeakPointer<X> &other) const |
(since 6.7) bool | owner_equal(const QSharedPointer<X> &other) const |
(since 6.7) bool | owner_equal(const QWeakPointer<X> &other) const |
(since 6.7) size_t | owner_hash() const |
void | swap(QWeakPointer<T> &other) |
QSharedPointer<T> | toStrongRef() const |
bool | operator bool() const |
bool | operator!() const |
QWeakPointer<T> & | operator=(const QSharedPointer<T> &other) |
QWeakPointer<T> & | operator=(const QWeakPointer<T> &other) |
相关非成员
QWeakPointer<X> | qWeakPointerCast(const QWeakPointer<T> &src) |
bool | operator!=(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2) |
bool | operator!=(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2) |
bool | operator!=(const QWeakPointer<T> &lhs, std::nullptr_t) |
bool | operator!=(std::nullptr_t, const QWeakPointer<T> &rhs) |
bool | operator==(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2) |
bool | operator==(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2) |
bool | operator==(const QWeakPointer<T> &lhs, std::nullptr_t) |
bool | operator==(std::nullptr_t, const QWeakPointer<T> &rhs) |
详细说明
QWeakPointer 是 C++ 中对指针的自动弱引用。它不能直接用于取消引用指针,但可用于验证指针是否已在其他上下文中被删除。
QWeakPointer 对象只能通过从QSharedPointer 进行赋值来创建。
需要注意的是,QWeakPointer 没有提供自动转换操作符来防止错误的发生。即使 QWeakPointer 跟踪指针,它本身也不应被视为指针,因为它不能保证被指向的对象仍然有效。
因此,要访问 QWeakPointer 跟踪的指针,必须先将其推广到QSharedPointer ,并验证得到的对象是否为空。QSharedPointer 保证对象不会被删除,因此,如果得到一个非空对象,就可以使用该指针。示例请参见QWeakPointer::toStrongRef() 。
另请参见 QSharedPointer 和QScopedPointer 。
成员函数文档
[noexcept, since 6.7]
template <typename X> bool QWeakPointer::owner_before(const QSharedPointer<X> &other) const
[noexcept, since 6.7]
template <typename X> bool QWeakPointer::owner_before(const QWeakPointer<X> &other) const
如果且仅当该智能指针在基于实现定义的所有者排序中位于other 之前时,才返回true
。如果两个智能指针都是空的,或者它们都拥有同一个对象(即使它们的表观类型和指针不同),则该排序被视为等价。
此函数在 Qt 6.7 中引入。
另请参见 owner_equal 。
[noexcept, since 6.7]
template <typename X> bool QWeakPointer::owner_equal(const QSharedPointer<X> &other) const
[noexcept, since 6.7]
template <typename X> bool QWeakPointer::owner_equal(const QWeakPointer<X> &other) const
如果且仅当该智能指针和other 共享所有权时,返回true
。
此函数在 Qt 6.7 中引入。
另请参阅 owner_before 和owner_hash 。
[noexcept, since 6.7]
size_t QWeakPointer::owner_hash() const
返回此智能指针对象基于所有者的哈希值。比较相等的智能指针(根据owner_equal
)将具有相同的基于所有者的哈希值。
此函数在 Qt 6.7 中引入。
另请参见 owner_equal 。
QWeakPointer::QWeakPointer()
创建一个不指向任何对象的 QWeakPointer。
QWeakPointer::QWeakPointer(const QSharedPointer<T> &other)
创建一个 QWeakPointer,为other 引用的指针提供弱引用。
如果T
是该类模板参数的派生类型,QWeakPointer 将执行自动转换。否则,编译器会出错。
[noexcept]
QWeakPointer::QWeakPointer(const QWeakPointer<T> &other)
创建一个 QWeakPointer,为other 引用的指针提供弱引用。
如果T
是该类模板参数的派生类型,QWeakPointer 将执行自动转换。否则,编译器会出错。
QWeakPointer::~QWeakPointer()
销毁QWeakPointer 对象。该对象引用的指针不会被删除。
void QWeakPointer::clear()
清除QWeakPointer 对象,并删除该对象对指针的引用。
bool QWeakPointer::isNull() const
如果此对象指向nullptr
,则返回true
。
需要注意的是,由于弱引用的特性,QWeakPointer 所引用的指针随时都可能变成nullptr
,因此从该函数返回的值可以在一次调用和下一次调用之间由 false 变为 true。
QSharedPointer<T> QWeakPointer::lock() const
与toStrongRef() 相同。
提供此函数是为了与 std::weak_ptr 的 API 兼容。
[noexcept]
void QWeakPointer::swap(QWeakPointer<T> &other)
将此弱指针实例与other 互换。这一操作速度非常快,而且从未出现过故障。
QSharedPointer<T> QWeakPointer::toStrongRef() const
将该弱引用提升为强引用,并返回一个持有该引用的QSharedPointer 对象。当升级到QSharedPointer 时,该函数会验证对象是否已被删除。如果没有,该函数会增加共享对象的引用计数,从而确保它不会被删除。
由于此函数可能无法获得共享对象的有效强引用,因此应始终在返回的对象上调用QSharedPointer::isNull() 来验证转换是否成功。
例如,以下代码将持有的QWeakPointer 转换为强引用,如果转换成功,则打印持有的整数值:
QWeakPointer<int>weakref;// ... QSharedPointer<int>strong=weakref.toStrongRef();if(strong) qDebug() << "The value is:" << *strong; 不然 qDebug() << "The value has already been deleted";
另见 QSharedPointer::QSharedPointer().
bool QWeakPointer::operator bool() const
如果包含的指针不是nullptr
,则返回true
。该函数适用于if-constructs
,如:
if (weakref) { ... }
请注意,由于弱引用的性质,QWeakPointer 所引用的指针随时可能变为nullptr
,因此从该函数返回的值可能在一次调用和下一次调用之间从 true 变为 false。
另请参见 isNull()。
bool QWeakPointer::operator!() const
如果此对象引用了nullptr
,则返回true
。此函数适用于if-constructs
,如:
if (!weakref) { ... }
请注意,由于弱引用的性质,QWeakPointer 所引用的指针随时都可能变成nullptr
,因此从该函数返回的值可能会从一次调用变为下一次调用的 true。
另请参见 isNull()。
QWeakPointer<T> &QWeakPointer::operator=(const QSharedPointer<T> &other)
使该对象共享other 的指针。当前指针引用将被丢弃,但不会被删除。
如果T
是本类模板参数的派生类型,QWeakPointer 将执行自动转换。否则,编译器会出错。
[noexcept]
QWeakPointer<T> &QWeakPointer::operator=(const QWeakPointer<T> &other)
使该对象共享other 的指针。当前指针引用将被丢弃,但不会被删除。
如果T
是本类模板参数的派生类型,QWeakPointer 将执行自动转换。否则,编译器会出错。
相关非成员
template <typename X, typename T> QWeakPointer<X> qWeakPointerCast(const QWeakPointer<T> &src)
返回一个弱指针,指向src 持有的指针,并转换为X
类型。T
和X
必须属于一个层次结构,这样static_cast
才能成功。
请注意,X
必须具有与T
相同的 cv-qualifiers (const
和volatile
),否则代码将无法编译。使用qSharedPointerConstCast 来消除 Constness。
template <typename T, typename X> bool operator!=(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2)
如果ptr1 和ptr2 指向不同的指针,则返回true
。
如果ptr2 的模板参数与ptr1 的模板参数不同,QSharedPointer 将尝试自动执行static_cast
,以确保比较的指针相等。如果ptr2 的模板参数不是ptr1 的基类型或派生类型,则会出现编译器错误。
template <typename T, typename X> bool operator!=(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
如果ptr1 和ptr2 指向不同的指针,则返回true
。
如果ptr2 的模板参数与ptr1 的模板参数不同,QSharedPointer 将尝试自动执行static_cast
,以确保比较的指针相等。如果ptr2 的模板参数不是ptr1 的基类型或派生类型,则会出现编译器错误。
template <typename T> bool operator!=(const QWeakPointer<T> &lhs, std::nullptr_t)
如果lhs 指向一个有效(即非空)指针,则返回true
。
另请参见 QWeakPointer::isNull()。
template <typename T> bool operator!=(std::nullptr_t, const QWeakPointer<T> &rhs)
如果rhs 指向一个有效(即非空)指针,则返回true
。
另请参见 QWeakPointer::isNull()。
template <typename T, typename X> bool operator==(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2)
如果ptr1 和ptr2 指向相同的指针,则返回true
。
如果ptr2 的模板参数与ptr1 的模板参数不同,QSharedPointer 将尝试自动执行static_cast
,以确保比较的指针相等。如果ptr2 的模板参数不是ptr1 的基类型或派生类型,则会出现编译错误。
template <typename T, typename X> bool operator==(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
如果ptr1 和ptr2 指向同一个指针,则返回true
。
如果ptr2 的模板参数与ptr1 的模板参数不同,QSharedPointer 将尝试自动执行static_cast
,以确保比较的指针相等。如果ptr2 的模板参数不是ptr1 的基类型或派生类型,则会出现编译错误。
template <typename T> bool operator==(const QWeakPointer<T> &lhs, std::nullptr_t)
如果lhs 指向nullptr
,则返回true
。
另请参阅 QWeakPointer::isNull() 。
template <typename T> bool operator==(std::nullptr_t, const QWeakPointer<T> &rhs)
如果rhs 指向nullptr
,则返回true
。
另请参阅 QWeakPointer::isNull() 。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.