这篇文章主要为大家展示了“如何实现auto_ptr”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现auto_ptr”这篇文章吧。
创新互联建站长期为1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为周村企业提供专业的网站建设、成都网站建设,周村网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。实现auto_ptr有两种方法:
第一种方法:在上一篇博客中我已经实现了,主要思想是管理权转移。
第二种方法:它是我们c++标准库中以前的一个版本,主要思想是在auto_ptr类中除了有一个指针的成员变量以外还有一个bool类型的成员变量_owner。构造函数中将_owner设为真,表示对象是指针所指向的内存的拥有者,当要赋值时(ap1=ap2),将ap1的_owner置为true,ap2的_owner置为false。
这样我们析构对象时只要检查它的_owner是否为true。为真就释放内存,不为真就不释放。
主要实现如下:
#includeusing namespace std; template class AutoPtr { public: AutoPtr(T* ptr) :_ptr(ptr) , _owner(true) {} ~AutoPtr() { if (_owner) { delete _ptr; } } AutoPtr(AutoPtr & ap) :_ptr(ap._ptr) , _owner(true) { ap._owner = false; } AutoPtr& operator=(AutoPtr & ap) { if (this != &ap) { if (_owner) { delete _ptr; } _ptr = ap._ptr; _owner = true; ap._owner = false; } return *this; } T* operator->() { return _ptr; } T& operator*() { return *_ptr; } private: T* _ptr; bool _owner; };
看完auto_ptr的实现,有人会问:
看起来这种方法更好些,它实现了可以一般指针的使用方式,可以有多个指针指向同一块内存,并且都可以访问这块内存,而我们知道,新版本的auto_ptr的实现方式(管理权转移)大的缺点就是不能有几个指针指向同一块内存,一个智能指针只能指向一块内存。
既然旧版本的智能指针实现方式比新版本的要好用,那为什么会被替换呢?
请看下面一段代码:
AutoPtrap1(new int(1)); if (1) { AutoPtr ap2(ap1); } *ap1 = 3;
这段代码是用旧版本实现的智能指针(ap1)指向一个动态开辟的内存,然后在if条件语句中又有一个ap2指向这块内存,我们会知道,根据旧版的智能指针的实现原理,ap1的_owner为false,ap2的_owner为true。那么除了if条件语句的局部作用域,ap2就自动调用析构函数释放内存,那么当我们在外面*ap1=3时,访问到的是一块已经被释放了的内存,那么程序这时就会出现问题。
如果是新版的auto_ptr,它提供了一个公有成员函数GetPtr(),可以获取指针_ptr,当发生这种情况时,它可以先判断_ptr是否为空,然后才去访问内存。旧版本这样做是无用的,因为ap1的_ptr并不为空。
以上是“如何实现auto_ptr”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联网站制作公司行业资讯频道!
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
当前标题:如何实现auto_ptr-创新互联
浏览路径:http://scgulin.cn/article/dcdpjp.html