热爱互联网

c++ 11 —- weak_ptr

详见:http://en.cppreference.com/w/cpp/memory/weak_ptr

weak_ptr 是为配合 shared_ptr 而引入的一种智能指针,它更像是 shared_ptr 的一个助手而不是智能指针,因为它不具有普通指针的行为,
没有重载 operator* 和 -> 。它的最大作用在于协助 shared_ptr 工作,像旁观者那样观测资源的使用情况。(这段话来自于《boost程序库完全开放指南 第二版》)

weak_ptr 保存一个已经被shared_ptr管理了的对象的weak_reference(弱引用),必须转换成shared_ptr 才能访问这个对象(用lock()转化)。
弱引用并不修改该对象的引用计数,这意味这弱引用它并不对对象的内存进行管理,在功能上类似于普通指针,然而一个比较大的区别是,弱引用能检测到所管理的对象是否已经被释放,从而避免访问非法内存。

下面是一个小例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<iostream>
#include<string>
#include<memory>
using namespace std;
 
weak_ptr<int> gw;
 
void f()
{
	if(gw.expired()){ // 用 expired() 也可以判断指针是否过期
		cout << "gw.expired(): gw is expired" <<endl;
	}
 
	if(auto spt = gw.lock()){ // 在使用之前必须copy到一个shared_ptr
		cout << *spt << endl;
	}
	else{
		cout << "gw is expired" <<endl;
	}
}
 
int main()
{
	{
		auto sp = make_shared<int>(42);
		gw = sp;
 
		cout << sp.use_count() <<endl;  // 仍然是 1
 
		f();
	}
 
	f();
 
	auto p = make_shared<int>(10);
 
	weak_ptr<int> q = p;
 
	//cout << *g <<endl;   // 非法,必须用 lock() 转化成 shared_ptr 才可以访问对象
 
	cout << *q.lock() <<endl;
 
	return 0;
}

Post a Comment

Your email is kept private. Required fields are marked *