+

shared_ptr的简易实现

+ + +
+ +

实现一个简易shared_ptr模板类需要些什么

    +
  1. 引用计数
  2. +
  3. 控制对引用计数访问权限的互斥锁
  4. +
  5. 构造函数,拷贝构造函数,重载赋值运算符,解引用运算符等等
  6. +
  7. 析构函数,避免在临界区访问引用计数
  8. +
+

类的私有成员变量

1
2
3
4
5
6
7
template<class T> 
class my_shared_ptr{
private:
int* _p_ref_count;
std::mutex* _p_mutex;
T* _p_ptr;
};
+ +

定义构造与析构函数

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
45
46
47
48
49
50
51
52
53
54
55
56
template<class T>
class my_shared_ptr{
public:
my_shared_ptr(T* ptr=nullptr):
_p_ref_count(new int(1)),
_p_mutex(new std::mutex),
_p_ptr(ptr) {}
my_shared_ptr(const my_shared_ptr<T>& msp)
_p_ref_count(msp._p_ref_count),
_p_mutex(msp._p_mutex),
_p_ptr(msp._p_ptr) {
add_ref_count();
}
~my_shared_ptr() {
release();
}
my_shared_ptr<T>& operator=(const my_shared_ptr<T>& msp) {
if(_p_ptr!=msp._p_ptr) {
release(); // 释放旧资源
_p_ref_count = msp._p_ref_count;
_p_mutex = msp._p_mutex;
_p_ptr = msp._p_ptr;
add_ref_count();
}
return *this;
}
T& operator*() {
return *_p_ptr;
}
T* operator->() {
return _p_ptr;
}
T* get() {
return _p_ptr;
}
int get_ref_count() {
return *_p_ref_count;
}
void add_ref_count() {
_p_mutex->lock();
++(*_p_ref_count);
_p_mutex->unlock();
}
private:
void release() {
bool delete_flag = false;
_p_mutex->lock();
if(--(*_p_ref_count)==0) {
delete _p_ref_count;
delete _p_ptr;
delete_flag = true;
}
_p_mutex->unlock();
if(delete_flag) delete _p_mutex;
}
};
+ +
+ +
+
+ + + + + + +
+
+
shared_ptr的简易实现
+
http://example.com/2023/08/11/shared-ptr的简易实现/
+
+
+ +
+
作者
+
Jinming Zhang
+
+ + +
+
发布于
+
2023年8月11日
+
+ + + +
+
许可协议
+
+ + + + + + + + + + +
+
+ +
+
+
+ + + + +
+ +
+ + +
+
+ +
+ + +