编写auto_ptr感

原创 2015年07月10日 16:47:13

首先,上自己编写的auto_ptr

#include<iostream>
using namespace std;

template<typename T>
class my_auto_ptr
{
public:
    //构造函数
    my_auto_ptr() :ptr(NULL)
    {}
    my_auto_ptr(const T *x) :ptr((T *)x)
    {}

    //拷贝构造函数
    my_auto_ptr(my_auto_ptr &other)
    {
        if (&other != this)
        {
            if (other.ptr == NULL)
                ptr = NULL;
            else
            {
                ptr = other.ptr;
                other.ptr = NULL;
            }
        }
    }

    //赋值函数重载
    my_auto_ptr& operator=(my_auto_ptr &other)
    {
        if (&other != this)
        {
            if (other.ptr == NULL)
                ptr = NULL;
            else
                ptr = other.ptr;
        }
        other.ptr = NULL;
        return *this;
    }

    //运算符的重载
    T* operator->()
    {
        return ptr;
    }

    T& operator*()
    {
        return *ptr;
    }
    T* get()
    {
        return ptr;
    }

    ~my_auto_ptr()
    {
        if (ptr)
            delete ptr;
    }
private:
    T *ptr;
    bool state;
};

int main()
{
    char *str2 = "lianyiming";
    char *a = new char[11];
    strcpy(a, str2);

    //无参数构造str
    my_auto_ptr<char> str;
    //传参数构造str1
    my_auto_ptr<char> str1(a);
    cout << *str1.get() << endl;

    //拷贝构造创建,将str1拷贝str3,此时str1变为NULL
    my_auto_ptr<char> str3(str1);
    cout << *str3.get() << endl;

    //赋值实现,将str3赋值传给str,此时str3变为NULL
    str = str3;
    cout << *str.get() << endl;
    return 0;
}
    在这里,我们首先要明白,auto_ptr的作用是用来保存一个指针,且这个指针不能指向对象为数组、类等复杂结构的数据。它的作用是,利用类的析构函数对指针指向的空间实现自动释放。然后,就是对auto_ptr的理解,auto_ptr实现保存一个指针,但不能有多个指针同时指向同一空间。即类似单例模式,一个空间,只允许一个智能指针来使用。

    下面,上源代码:

#include<iostream>
//#include<memory>
using namespace std;
//RAII 机制
template<class _Ty>
class auto_ptr
{
public:
	explicit auto_ptr(_Ty *_P = 0) :_Owns(_P != 0), _Ptr(_P) //_Owns初始化为假
	{}
	auto_ptr(const auto_ptr<_Ty> &_Y) :
		_Owns(_Y._Owns), _Ptr(_Y.release())
	{}
	auto_ptr<_Ty>& operator=(const auto_ptr<_Ty> &_Y)
	{
		if (this != &_Y)
		{
			if (_Ptr != _Y.get())
			{
				if (_Owns)
				{
					delete _Ptr;
					_Owns = _Y._Owns;
				}
				else if (_Y._Owns)
				{

					_Owns = true;
					_Ptr = _Y.release();
				}
			}
		}
		return *this;
	}
	~auto_ptr()
	{
		if (_Owns)
			delete _Ptr;
	}
public:
	//_Ty*release(const auto_ptr<_Ty> *const this)
	_Ty* release()const
	{
		((auto_ptr<_Ty> *)this)->_Owns = false;
		return _Ptr;
	}
	_Ty& operator*()const
	{
		return (*get());
	}
	_Ty* operator->()const
	{
		return(get());
	}

	_Ty* get()const
	{
		return _Ptr;
	}
private:
	bool _Owns;  //是否对内存进行释放  真-->释放; 假-->不调用析构
	_Ty *_Ptr;
};

void main()
{
	auto_ptr<int> ptr;
}

其为通过_Owns来设置所有权。在这里注意关键字explicit,其目的是为了防止发生隐式的转换构造函数的调用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

auto_ptr到底能不能作为容器的元素?

【摘要】对C++语言本身来说,它并不在乎用户把什么类型的对象作为STL容器的元素,因为模板类型参数在理论上可以为任何类型。比如说STL容器仅支持“值”语义而不支持“引用(&)”语义,并非因为模板类型参...
  • ysu108
  • ysu108
  • 2014年09月10日 09:38
  • 693

C++ 只能指针 auto_ptr 原理 解析 源码

By SmartPtr(http://www.cppblog.com/SmartPtr/) auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智...
  • wang_jing_2008
  • wang_jing_2008
  • 2012年08月30日 12:50
  • 1083

std::auto_ptr的原理及使用

使用auto_ptr作为成员变量,以避免资源泄漏。防止资源泄漏,我们通常在构造函数中申请,析构函数中释放,但是只有构造函数调用成功,析构函数才会被调用,换句话说,如果在构造函数中产生了异常,那么析构函...
  • makenothing
  • makenothing
  • 2015年11月13日 17:38
  • 3902

C++ boost智能指针auto_ptr

auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智能指针,这个不怎么智能的智能指针难免会黯然失色。诚然,auto_ptr有这样那样的不如人意,以至于...
  • u011676589
  • u011676589
  • 2013年08月30日 16:40
  • 1096

auto_ptr的release的含义

我一直以为auto_ptr的release函数会调用delete操作符删除 其所包含的指针,今天才搞清楚,release函数只是简单的释放其对指针的拥有权。...
  • swordmanwk
  • swordmanwk
  • 2011年01月30日 14:31
  • 3726

std::auto_ptr 不能赋值 简析

今天试用了下std::auto_ptr, 第一次使用就出错了,尴尬啊,先还原现场:类内声明:Std::auto_ptr m_pWgt;类构造函数内赋值:m_pWgt = new Widget;大概就是...
  • webScaler
  • webScaler
  • 2010年09月18日 12:28
  • 2582

智能指针:从std::auto_ptr到std::unique_ptr

std::auto_ptr封装动态申请对象内存返回的指针,并且其行为也和普通指针一样。最重要的一点,程序员不必记得去释放之前申请的内存,当std::auto_ptr销毁时,其封装的指针所指向的内存也会...
  • hanhuili
  • hanhuili
  • 2012年12月15日 21:38
  • 5600

c++中的智能指针auto_ptr解析

c++中的auto_ptr是一个类,却可以像指针一样去使用。使用auto_ptr需要包含头文件#include 例如:auto_ptr ps(new string("hello"));可以像指针一样...
  • uestclr
  • uestclr
  • 2016年05月06日 10:56
  • 1587

实现auto_ptr的两种方法

我们都知道,实现auto_ptr有两种方法:第一种方法:在上一篇博客中我已经实现了,主要思想是管理权转移。第二种方法:它是我们c++标准库中以前的一个版本,主要思想是在auto_ptr类中除了有一个指...
  • xyzbaihaiping
  • xyzbaihaiping
  • 2016年04月11日 20:04
  • 1173

auto_ptr 与 shared_ptr 用法和区别总结

1.auto_ptr 被复制后,将失去原来所致资源的所有权;
  • Manketon
  • Manketon
  • 2014年07月08日 12:29
  • 2077
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编写auto_ptr感
举报原因:
原因补充:

(最多只允许输入30个字)