C++智能指针shared_ptr分析

2025-05-27 0 89

C++智能指针shared_ptr分析

概要:

shared_ptr是c++智能指针中适用场景多,功能实现较多的智能指针。它采取引用计数的方法来实现释放指针所指向的资源。下面是我代码实现的基本功能。

实例代码:

?

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 sharedptr

{

public:

sharedptr(T* ptr)

:_ptr(ptr)

, _refCount(new int(1))

{}

sharedptr(sharedptr<T>& sp)

:_ptr(sp._ptr)

, _refCount(sp._refCount)

{

++(*_refCount);

}

sharedptr& operator = (sharedptr<T>& sp) //现代写法

{

swap(_ptr, sp._ptr);

swap(_refCount, sp._refCount);

return *this;

}

/*sharedptr& operator = (sharedptr<T>& sp)

{

if (this != &sp)

{

this->Release();

_ptr = sp._ptr;

_refCount = sp._refCount;

++(*_refCount);

}

return *this;

}*/

void Release()

{

if (--(*_refCount) == 0)

{

delete _ptr;

delete _refCount;

}

}

~sharedptr()

{

Release();

}

private:

T* _ptr;

int* _refCount;

};

但是呢这只能删除基本类型,例int、double类型指针。但对于数组指针不是适用。在c++中动态内存管理中,new/delete对应,new[]/delete[]对应,所以就引入了定制删除器这个概念。

定制删除器基本的实现就是:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17
template<class T>

struct Delete

{

void operator()(T* ptr)

{

delete ptr;

}

};

template<class T>

struct DeleteArray

{

void operator()(T* ptr)

{

delete[] ptr;

}

};

如何在shared_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

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71
template<class T> //定制删除器

struct Delete

{

void operator()(T* ptr)

{

delete ptr;

}

};

template<class T>//定制删除器

struct DeleteArray

{

void operator()(T* ptr)

{

delete[] ptr;

}

};

template<class T, class D = Delete<T>>

class sharedptr

{

public:

sharedptr(T* ptr, D del)

:_ptr(ptr)

, _refCount(new int(1))

, _del(del)

{}

sharedptr(sharedptr<T>& sp)

:_ptr(sp._ptr)

, _refCount(sp._refCount)

{

++(*_refCount);

}

sharedptr& operator = (sharedptr<T>& sp) //现代写法

{

swap(_ptr, sp._ptr);

swap(_refCount, sp._refCount);

return *this;

}

/*sharedptr& operator = (sharedptr<T>& sp)

{

if (this != &sp)

{

this->Release();

_ptr = sp._ptr;

_refCount = sp._refCount;

++(*_refCount);

}

return *this;

}*/

void Release()

{

if (--(*_refCount) == 0)

{

printf("delete:0x%p\\n", _ptr);

_del(_ptr);

delete _refCount;

}

}

~sharedptr()

{

Release();

}

private:

T* _ptr;

int* _refCount;

D _del;

};

在调用时,应这样写调用函数:

?

1

2

3

4

5

6
void TextSharedptr()

{

DeleteArray<int> da;

sharedptr<int, DeleteArray<int>> sp(new int[3], da);

}

而weak_ptr弱引用智能指针是通过(引用不增加计数)来打破循环引用的;

什么循环引用,这可以简单用一个双向链表来解释:

C++智能指针shared_ptr分析

而weak_ptr通过只引用不增加计数的方法打破了循环引用这个问题。但在使用weak_ptr的前提是确定在使用shared_ptr智能指针时存在循环引用这个问题。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 C++智能指针shared_ptr分析 https://www.kuaiidc.com/73923.html

相关文章

发表评论
暂无评论