所谓智能指针就是自动化管理指针所指向的动态资源的释放。
成都创新互联公司是专业的吴堡网站建设公司,吴堡接单;提供网站设计、网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行吴堡网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!那么智能指针的引用是为了解决哪些问题呢?
代码中经常会忘掉释放动态开辟的资源,引用智能指针可用于动态资源管理,资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数中完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。
智能指针的原理:智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类是栈上的对象,智能指针指向堆上开辟的空间,函数结束时,栈上的函数会自动被释放,智能指针指向的内存也会随之消失,防止内存泄漏。
智能指针的实现需要实现构造、析构、拷贝构造、操作符重载。
几种常见的智能指针的区别?
auto_ptr:就是内部使用一个成员变量指向一块内存资源(构造函数),并且在析构函数中释放内存资源。auto_ptr的拷贝构造和赋值操作符重载函数所接受的参数都是非const的引用类型(即我们可以且修改资源),不能共享所有权(其它任意一个指针指向这块内存,它会把内存给别的指针,自己不指向了)。权限转移。
templateclass Auto_Ptr { public: Auto_Ptr(T *ptr = NULL) :_ptr(ptr) {} ~Auto_Ptr() { if (_ptr != NULL) { delete _ptr; cout<<"~Auto_Ptr()"< &ap) :_ptr(ap._ptr) { ap._ptr = NULL; } Auto_Ptr &operator= (Auto_Ptr &ap) { if (this != &ap) { delete _ptr; _ptr = ap._ptr; ap._ptr = NULL; } return *this; } private: T *_ptr; }; void Test1() { Auto_Ptr a1(new int(1)); Auto_Ptr a2(a1); Auto_Ptr a3(new int(2)); a1 = a1; a2 = a3; }
scoped_ptr有着与auto_ptr类似的特性,scoped_ptr与auto_ptr大的区别主要在于对内存资源拥有权的处理。(auto_ptr在拷贝构造时会从源auto_ptr自动交出拥有权,而scoped_ptr则不允许被拷贝)。scoped_ptr不能资源共享。
templateclass Scoped_Ptr { public: Scoped_Ptr(T *ptr) :_ptr(ptr) {} ~Scoped_Ptr() { if (_ptr != NULL) { delete _ptr; cout<<"~Scoped_Ptr()"< &sp); Scoped_Ptr &operator=(const Scoped_Ptr &sp); T *_ptr; }; void Test2() { Scoped_Ptr s1(new int(1)); //Scoped_Ptr s2(s1); Scoped_Ptr s3(new int(2)); //s1 = s1; //s2 = s3; }
shared_ptr就是为了解决auto_ptr在对象所有权上的局限性,在使用引用计数的基础上提供了可以共享所有权的智能指针。当新增一个shared_ptr对该对象进行管理时,就将该对象的引用计数加一,同理减少一个时,计数器减一。当该对象的引用计数器为0时,调用delete释放其所占的内存。
templateclass Shared_Ptr { public: Shared_Ptr(T *ptr) :_ptr(ptr) ,_count(new int(1)) {} ~Shared_Ptr() { if(--(*_count) == 0) { delete _ptr; delete _count; cout<<"~Shared_Ptr()"< &sp) :_ptr(sp._ptr) ,_count(sp._count) { (*_count)++; } Shared_Ptr &operator=(Shared_Ptr &sp) { if (this != &sp) { if (--(*_count) == 0) { delete _ptr; delete _count; } _ptr = sp._ptr; _count = sp._count; (*_count)++; } return *this; } private: T *_ptr; int *_count; }; void Test3() { Shared_Ptr s1(new int(1)); Shared_Ptr s2(s1); Shared_Ptr s3(new int(2)); s1 = s1; s1 = s3; }
shared_ptr存在循环引用的问题,使用weak_ptr可以用来避免循环引用。但是weak_ptr对象引用资源时不会增加引用计数,无法知道资源会不会被突然释放,所以无法通过weak_ptr访问资源。在访问资源时weak_ptr必须先转化为shared_ptr。
#include#include #include using namespace std; using namespace boost; struct ListNode { shared_ptr _prev; shared_ptr _next; //weak_ptr _prev; //weak_ptr _next; ~ ListNode() { cout<<"~ListNode()" < p1( new ListNode ()); shared_ptr p2( new ListNode ()); cout <<"p1->Count:" << p1. use_count()< Count:" << p2. use_count()< _next = p2; // p2节点的_prev指向 p1节点 p2->_prev = p1; cout <<"p1->Count:" << p1. use_count ()< Count:" << p2. use_count ()< 另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章名称:智能指针的原理及其应用-创新互联
本文网址:http://chengdu.cdxwcx.cn/article/hpsch.html