十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
shared_ptr
创新互联主营秦淮网站建设的网络公司,主营网站建设方案,app软件定制开发,秦淮h5小程序开发搭建,秦淮网站营销推广欢迎秦淮等地区企业咨询 shared_ptr是一种智能指针,他的作用如同指针,但会记录有多少shared_ptr指向同一个对象。使用时必须引用头文件
templateclass ShartedPtr { public: //构造函数 ShartedPtr(T* ptr) :_ptr(ptr) , _pCount(new int(1)) { } //拷贝构造 ShartedPtr(const ShartedPtr &sp) :_ptr(sp._ptr) , _pCount(sp._pCount) { ++(*_pCount); } //赋值 ShartedPtr&operator = (ShartedPtr sp) { swap(_ptr, sp._ptr); swap(_pCount, sp._pCount); return *this; } //重载* T &operator*() { return *_ptr; } //重载-> T *operator->() { return _ptr; } //析构函数 ~ShartedPtr() { Relase(); } protected: void Relase() { if (--(*_pCount) == 0) { delete _ptr; delete _pCount; } } private: T* _ptr; int *_pCount; }; struct A { int _A; }; int main() { ShartedPtr sp1(new int(1)); ShartedPtr sp2(sp1); sp1 = sp2; ShartedPtr sp3(sp2); *sp3 = 10; ShartedPtrsp4(new A); sp4->_A = 30; return 0; }
但是shared_ptr也存在一系列问题
引用计数存在线程安全问题
会出现循环引用问题
定制删除器
循环引用即在使用双向链表时,若使用shared_ptr则会出现在析构时由于同一块空间有两个对象指向,且对象两两之间相互指向,故在析构时两对象都在等对方的_pCount减为一,从而一直到最后对象都没有析构
shared_ptrcur(new Node(1)); shared_ptr next(new Node(1)); cur->_next=next; next->_prev=cur;
shared_ptr的定制删除器
templateclass ShartedPtr { public: //构造函数 ShartedPtr(T* ptr) :_ptr(ptr) , _pCount(new int(1)) { } //构造函数的一个重载 ShartedPtr(T* ptr,D del) :_ptr(ptr) , _pCount(new int(1)) , _del(del) { } //拷贝构造 ShartedPtr(const ShartedPtr &sp) :_ptr(sp._ptr) , _pCount(sp._pCount) { ++(*_pCount); } //赋值 ShartedPtr&operator = (ShartedPtr sp) { swap(_ptr, sp._ptr); swap(_pCount, sp._pCount); return *this; } //重载* T &operator*() { return *_ptr; } //重载-> T *operator->() { return _ptr; } //析构函数 ~ShartedPtr() { Release(); } protected: void Release() { if (--(*_pCount) == 0) { _del( _ptr); delete _pCount; } } private: T* _ptr; int *_pCount; D _del; }; struct DefaultDel { void operator()(void* ptr) { delete ptr; } }; struct Free { void operator()(void* ptr) { free(ptr); } }; //struct Fclose //{ // void operator()(void* ptr) // { // fclose(FILE*(ptr)); // } //}; int main() { ShartedPtr sp1(new int(1)); ShartedPtr sp2((int*)malloc(sizeof(int))); }
ps:仿函数的介绍
仿函数就是使一个类使用看上去像一个函数,其实现就是类中实现一个operator().这个类就有了类似函数的行为。
struct Free { void operator()(void *ptr) { free( ptr); } }; void Testsharedptr() { int *p1=(int*)malloc(sizeof(int)*10); shared_ptrsp1(p1,Free());//在使用完后自动释放p1 }
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。