0%

智能指针

shared_ptr

多个shared_pt智能指针可以使用同一块堆内存,并且该类型只能指针在实现上采用的是引用计数机制。

即使有一个shared_ptr放弃了堆内存的使用权 (引用计数减1) 也不会影响其他shared_ptr的使用 只有引用计数为0 堆内存才会释放。

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
template<class T>
class my_shared_ptr
{
private:
int* _count;
T* _ptr;
public:

my_shared_ptr(T* ptr=nullptr){ // 构造函数,默认参数
_ptr = ptr;
_count = nullptr;

if(_ptr){
_count = new int(1);
}
}

~my_shared_ptr(){ // 析构函数
if(_ptr&& --(*_count)==0){
delete _ptr;
}
}

my_shared_ptr(const my_shared_ptr<T>& a){ // 拷贝构造函数
_ptr = a._ptr;
_count = a._count;
if(_ptr){
(*_count) ++;
}
}

my_shared_ptr<T>& operator=(const my_shared_ptr<T>& a){ // 赋值运算符
if(this != &a){
if(_ptr && --(*_count)==0){
delete _ptr;
}

_ptr = a._ptr;
_count = a._count;

if(_ptr){
(*_count) ++;
}
}
}

int getCount(){
return *_count;
}
};

weak_ptr

c++11虽然将weak_ptr指针定为智能指针的一种,但是该类型指针通常不单独使用(没有实际用处)

只能和share_ptr类型指针搭配使用,甚至我们将weak_ptr视为shared_ptr的一个辅助工具

借助weak_ptr指针我们可以获得shared_ptr指针的一些状态信息

比如有多少指向相同的shared_ptr指针,share_ptr指针指向的堆内存是否释放等等

unique_ptr

unique_ptr也具备“在适当的时机自动释放堆内内存空间”的能力

和shared_ptr最大的不同之处就是在于 unique_ptr指针指向的堆内存无法将其与其他unique_str共享

也就是说unique_ptr指针都独自拥有对其所指堆内存空间的所有权

这也就是说 每个unique_str指针指向的堆内存空间的引用计数就是只能为1

一旦该unique_ptr指针放弃所致堆内存空间的所有权,该空间会被立即释放回收

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<class T>
class my_unique_ptr
{
private:
T* _ptr;
public:
my_unique_ptr(T* ptr=nullptr){
_ptr = ptr;
};
~my_unique_ptr(){
if(_ptr){
delete _ptr;
_ptr = nullptr;
}
};
my_unique_ptr(const my_unique_ptr<T> &a) = delete;
my_unique_ptr<T>& operator=(const my_unique_ptr<T> &a) = delete;
};

Welcome to my other publishing channels