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++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。