当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ weak_ptr用法及代码示例


weak_ptr 是智能指针之一,它提供了指针的函数,并且与原始指针相比,风险降低了一些。 weak_ptr 与 shared_ptr 一样,能够指向另一个 shared_ptr 拥有的资源,但不拥有它。换句话说,他们能够创建对 shared_ptr 管理的对象的非拥有引用。

需要weak_ptr

要了解 weak_ptr 的需求,我们需要首先了解 shared_ptr 的用例,它会导致一个称为循环链接的常见问题。当两个或多个对象使用 shared_ptr 相互引用时,就会发生这种情况。例如,如果ObjectA 有一个到ObjectB 的shared_ptr,而ObjectB 有一个到ObjectA 的shared_ptr,则它们形成循环引用。这可能会产生问题,因为 ObjectA 和 ObjectB 都不会被删除,从而导致内存泄漏。

在这里,weak_ptr 通过提供一种打破这些循环引用的方法来解决这个问题。它允许您创建对 shared_ptr 管理的对象的非自己引用,而不影响引用计数或阻止对象被删除。

weak_ptr 的语法

weak_ptr 可以使用以下语法声明:

std::weak_ptr<type> name;

其中类型是它指向的数据类型。

std::weak_ptr 成员函数

以下是与 std::weak_ptr 关联的一些成员函数,以提供不同的函数。

编号 函数 说明

1

reset() 清除weak_ptr。

2

swap std 的特化:swap()。它交换weak_ptr管理的对象。

3

expired() 检查weak_ptr指向的资源是否存在。

4

lock() 如果weak_ptr指向的资源存在,则该函数返回具有该资源所有权的shared_ptr。如果资源不存在,则返回默认构造的shared_ptr。

5

use_count() 告诉有多少shared_ptr拥有该资源。

weak_ptr 的示例

以下示例演示了weak_ptr如何解决循环引用问题。

C++


// C++ program to illustrate the use of weak_ptr
#include <iostream>
#include <memory>
using namespace std;
// declaring a dummy object
class Object {
public:
    Object(int value)
        : data(value)
    {
        cout << "Object created with value: " << data
             << endl;
    }
    ~Object()
    {
        cout << "Object destroyed with value: " << data
             << endl;
    }
    int data;
};
// driver code
int main()
{
    // creating shared pointer with resource ownership
    shared_ptr<Object> sharedObjectA
        = make_shared<Object>(42);
    // creating weak pointer to the previously created
    // shared objects
    weak_ptr<Object> weakObjectA = sharedObjectA;
    // Access objects using weak_ptr
    if (!weakObjectA.expired()) {
        cout << "The value stored in sharedObjectA:"
             << (*weakObjectA.lock()).data << endl;
    }
    // deleting object
    sharedObjectA.reset();
    cout << "End of the Program";
    return 0;
}
输出
Object created with value: 42
The value stored in sharedObjectA:42
Object destroyed with value: 42
End of the Program

在此示例中,我们创建一个具有动态创建对象所有权的shared_ptr。然后我们创建了一个weak_ptr,它引用与shared_ptr相同的资源。重置shared_ptr后,我们可以看到它被销毁并从内存中释放。

weak_ptr的应用

以下是weak_ptr的主要应用:

  • 防止循环引用:weak_ptr的主要应用是防止循环引用。当一个对象想要引用另一个对象而不拥有它时,可以使用weak_ptr。这确保了不会创建循环引用,并且当不再需要对象时可以安全地释放它们。
  • 缓存系统:weak_ptr常用于缓存实现。缓存通常需要临时存储对对象的引用,而不阻止在不再使用这些对象时删除这些对象。 weak_ptr为此用例提供了一个优雅的解决方案。


相关用法


注:本文由纯净天空筛选整理自beliver01大神的英文原创作品 weak_ptr in C++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。