當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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