什么时候是std :: weak
我开始研究C ++ 11的智能指针,我没有看到std::weak_ptr
任何有用的用法。 有人可以告诉我什么时候std::weak_ptr
是有用/必要的?
一个很好的例子就是缓存。
对于最近访问的对象,你想保留它们在内存中,所以你持有一个强大的指针。 定期扫描缓存并确定哪些对象最近未被访问过。 你不需要把它们留在记忆中,所以你可以摆脱强壮的指针。
但是如果该对象正在使用中,并且其他一些代码拥有强大的指针呢? 如果缓存摆脱了它唯一指向对象的指针,它就再也找不到它了。 所以缓存保持一个弱指针,如果它们碰巧留在内存中,它需要找到对象。
这正是弱指针的作用 - 它允许您定位一个对象,如果它仍然在附近,但是如果没有其他东西需要它,它不会保留它。
std::weak_ptr
是解决悬挂指针问题的一个很好的方法。 通过使用原始指针,不可能知道引用的数据是否已被释放。 相反,通过让std::shared_ptr
管理数据,并为数据的用户提供std::weak_ptr
,用户可以通过调用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 << *tmp << 'n';
else
std::cout << "weak1 is expiredn";
// weak2 points to new data (5)
if(auto tmp = weak2.lock())
std::cout << *tmp << 'n';
else
std::cout << "weak2 is expiredn";
}
另一个答案,希望更简单。 (对于谷歌同行)
假设你有Team
和Member
对象。
显然这是一种关系: Team
对象会指向其Members
。 而且成员很可能也会有一个指向他们的Team
对象的返回指针。
然后你有一个依赖周期。 如果您使用shared_ptr
,那么当您放弃对它们的引用时,对象将不再自动释放,因为它们以循环方式相互引用。 这是内存泄漏。
你可以使用weak_ptr
这个问题。 “所有者”通常使用shared_ptr
,“拥有”使用weak_ptr
给它的父代,并在需要访问其父代时将其临时转换为shared_ptr
。
存储一个弱ptr:
weak_ptr<Parent> parentWeakPtr_ = parentSharedPtr; // automatic conversion to weak from shared
然后在需要时使用它
shared_ptr<Parent> tempParentSharedPtr = parentWeakPtr_.lock(); // on the stack, from the weak ptr
if( not tempParentSharedPtr ) {
// yes it may failed if parent was freed since we stored weak_ptr
} else {
// do stuff
}
// tempParentSharedPtr is released when it goes out of scope
链接地址: http://www.djcxy.com/p/20769.html
上一篇: When is std::weak