如何实现auto_ptr

发布时间:2021-10-21 11:09:44 作者:小新
来源:亿速云 阅读:131

这篇文章主要为大家展示了“如何实现auto_ptr”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现auto_ptr”这篇文章吧。

实现auto_ptr有两种方法:

第一种方法:在上一篇博客中我已经实现了,主要思想是管理权转移。

第二种方法:它是我们c++标准库中以前的一个版本,主要思想是在auto_ptr类中除了有一个指针的成员变量以外还有一个bool类型的成员变量_owner。构造函数中将_owner设为真,表示对象是指针所指向的内存的拥有者,当要赋值时(ap1=ap2),将ap1的_owner置为true,ap2的_owner置为false。

这样我们析构对象时只要检查它的_owner是否为true。为真就释放内存,不为真就不释放。

主要实现如下:

#include<iostream>
using namespace std;
template<class T>
class AutoPtr
{
public:
     AutoPtr(T* ptr)
     :_ptr(ptr)
     , _owner(true)
     {}
     ~AutoPtr()
     {
          if (_owner)
          {
               delete _ptr;
          }
     }
     AutoPtr(AutoPtr<T>& ap)
      :_ptr(ap._ptr)
      , _owner(true)
     {
          ap._owner = false;
     }
     AutoPtr& operator=(AutoPtr<T>& 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的实现方式(管理权转移)最大的缺点就是不能有几个指针指向同一块内存,一个智能指针只能指向一块内存。

既然旧版本的智能指针实现方式比新版本的要好用,那为什么会被替换呢?

请看下面一段代码:

AutoPtr<int> ap1(new int(1));

 if (1)

 {

  AutoPtr<int> 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”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

推荐阅读:
  1. BitMap实现
  2. auto_ptr的两种方案

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

auto_ptr

上一篇:怎么编写API接口

下一篇:Java之怎么实现从Map到HashMap

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》