编写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,其目的是为了防止发生隐式的转换构造函数的调用。

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

C++易混知识点4: 自己编写一个智能指针(Reference Counting)学习auto_ptr和reference counting

这篇文章建大的介绍了如何编写一个智能指针。 介绍:  什么是智能指针?答案想必大家都知道,智能指针的目的就是更好的管理好内存和动态分配的资源,智能指针是一个智能的指针,顾名思义,他可以帮助我们管理内存...

自动指针auto_ptr

  • 2013年02月25日 10:18
  • 59KB
  • 下载

智能指针auto_ptr、内存泄漏解决

在C++11中,已经不使用auto_ptr,而用 unique_ptr进行替代,不过二者原理都差不多。头文件:memory智能指针:实质上是一个类,在创建智能指针的时候,本质上是在栈上创建了一个对象...

浅谈auto_ptr智能指针

在c++标准库里主要有三个智能指针: ①auto_ptr 在任何情况下都不要使用 ②scoped_ptr 独占空间,防拷贝和赋值,是对第①个智能指针的缺陷所作出的解决 ③shared_ptr 利用...

智能指针从auto_ptr说起

从何说起,从”auto_ptr”说起 那还是在上大学的时候,看了《C++标准程序库:自修教程与参考手册》,看到auto_ptr这个东西;哎呦,不错,是个好东西,然后看了看;还记得,参加亚信联创的招聘...

auto_ptr类的源码注解

源码及注释如下,这比记忆语法好多了!个人认为,auto_ptr类设计地不行,比如都不能作为参数传递(传递后实参就没用了),失去了C指针的经典优势! // auto_ptr类的简化版,删除了有关aut...
  • Justme0
  • Justme0
  • 2012年10月21日 21:08
  • 997

一个auto_ptr_ref引发的连锁思考

《C++标准程序库》,auto_ptr_ref,智能指针

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

By SmartPtr(http://www.cppblog.com/SmartPtr/) auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智...

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

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

[C++标准模板库:自修教程与参考手册]关于auto_ptr

什么是auto_ptr指针auto_ptr是这样一种指针:它是“它所指的对象”的拥有者,所以,当身为对象拥有者的auto_ptr指针被摧毁时,该对象也会被摧毁,auto_ptr要求一个对象只能拥有一个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编写auto_ptr感
举报原因:
原因补充:

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