gpt4 book ai didi

c++11 - std::weak_ptr 什么时候有用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:38:36 25 4
gpt4 key购买 nike

我开始研究 C++11 的智能指针,但我没有看到 std::weak_ptr 有任何有用的用途。有人能告诉我什么时候 std::weak_ptr 有用/必要吗?

最佳答案

std::weak_ptr 是解决 dangling pointer 的一个很好的方法问题。通过仅使用原始指针,不可能知道引用的数据是否已被释放。相反,通过让 std::shared_ptr 管理数据,并向数据用户提供 std::weak_ptr,用户可以通过调用 来检查数据的有效性code>expired()lock()

你不能单独使用 std::shared_ptr 来做到这一点,因为所有 std::shared_ptr 实例共享数据的所有权,这些数据在所有实例之前没有被删除std::shared_ptr 被移除。以下是如何使用 lock() 检查悬挂指针的示例:

#include <iostream>
#include <memory>

int main()
{
// OLD, problem with dangling pointer
// PROBLEM: ref will point to undefined data!

int* ptr = new int(10);
int* ref = ptr;
delete ptr;

// NEW
// SOLUTION: check expired() or lock() to determine if pointer is valid

// empty definition
std::shared_ptr<int> sptr;

// takes ownership of pointer
sptr.reset(new int);
*sptr = 10;

// get pointer to data without taking ownership
std::weak_ptr<int> weak1 = sptr;

// deletes managed object, acquires new pointer
sptr.reset(new int);
*sptr = 5;

// get pointer to new data without taking ownership
std::weak_ptr<int> weak2 = sptr;

// weak1 is expired!
if(auto tmp = weak1.lock())
std::cout << "weak1 value is " << *tmp << '\n';
else
std::cout << "weak1 is expired\n";

// weak2 points to new data (5)
if(auto tmp = weak2.lock())
std::cout << "weak2 value is " << *tmp << '\n';
else
std::cout << "weak2 is expired\n";
}

输出

weak1 is expired
weak2 value is 5

关于c++11 - std::weak_ptr 什么时候有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56494521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com