时间:2021-05-20
C++智能指针shared_ptr分析
概要:
shared_ptr是c++智能指针中适用场景多,功能实现较多的智能指针。它采取引用计数的方法来实现释放指针所指向的资源。下面是我代码实现的基本功能。
实例代码:
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[]对应,所以就引入了定制删除器这个概念。
定制删除器基本的实现就是:
template<class T>struct Delete{ void operator()(T* ptr) { delete ptr; }};template<class T>struct DeleteArray{ void operator()(T* ptr) { delete[] ptr; }};如何在shared_ptr中使用呢,下来我用代码简单做个示范。
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;};在调用时,应这样写调用函数:
void TextSharedptr(){ DeleteArray<int> da; sharedptr<int, DeleteArray<int>> sp(new int[3], da);}而weak_ptr弱引用智能指针是通过(引用不增加计数)来打破循环引用的;
什么循环引用,这可以简单用一个双向链表来解释:
而weak_ptr通过只引用不增加计数的方法打破了循环引用这个问题。但在使用weak_ptr的前提是确定在使用shared_ptr智能指针时存在循环引用这个问题。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
shared_ptr是一种智能指针(smartpointer)。shared_ptr的作用有如同指针,但会记录有多少个shared_ptrs共同指向一个对象。这
c++11添加了新的智能指针,unique_ptr、shared_ptr和weak_ptr,同时也将auto_ptr置为废弃(deprecated)。但是在实际
在前面一篇文章中,我们了解了C++11中引入的智能指针之一shared_ptr和weak_ptr,今天,我们来介绍一下另一种智能指针unique_ptr。往期文
如题,我们今天要讲的是C++11引入的三种智能指针中的:weak_ptr。在学习weak_ptr之前最好对shared_ptr有所了解。如果你还不知道share
最近看代码,智能指针用的比较多,自己平时用的少,周末自己总结总结。方便后续使用。std::shared_ptr大概总结有以下几点:(1)智能指针主要的用途就是方