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为此用例提供了一个优雅的解决方案。
相关用法
- C++ wctomb()用法及代码示例
- C++ wcstombs()用法及代码示例
- C++ wcout用法及代码示例
- C++ wcerr用法及代码示例
- C++ wcin用法及代码示例
- C++ wclog用法及代码示例
- C++ wctrans()用法及代码示例
- C++ wctype()用法及代码示例
- C++ wprintf()用法及代码示例
- C++ wscanf()用法及代码示例
- C++ wcstof()用法及代码示例
- C++ wcstol()用法及代码示例
- C++ wcstold()用法及代码示例
- C++ wcstok()用法及代码示例
- C++ wcstod()用法及代码示例
- C++ wcrtomb()用法及代码示例
- C++ wctob()用法及代码示例
- C++ wcsrtombs()用法及代码示例
- C++ wcscat()用法及代码示例
- C++ wcschr()用法及代码示例
- C++ wcscmp()用法及代码示例
- C++ wcsncmp()用法及代码示例
- C++ wcscpy()用法及代码示例
- C++ wcscspn()用法及代码示例
- C++ wcslen()用法及代码示例
注:本文由纯净天空筛选整理自beliver01大神的英文原创作品 weak_ptr in C++。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。