编写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

  • 2011-03-15 15:11
  • 341KB
  • 下载

自动指针auto_ptr

  • 2013-02-25 10:18
  • 59KB
  • 下载

auto_ptr 自动指针

从一个小例子说起: 一般定义的raw指针是这样的使用 classCBase; classDerive : public CBase { CBase*pa = new Derive;//如果这...

auto_ptr类的源码注解

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

auto_ptr

auto_ptr   C++的auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理。   它的源代码:   namespace   classpriva...

动态分配资源的自动释放 – auto_ptr的实现原理

动态分配资源的自动释放的英文是 Resource Allocation In Initialization,通常缩写成RAII。 根据《C++ Primer》第4版: “ During stac...

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

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

以对象管理资源——C++智能指针auto_ptr简介

auto_ptr是C++标准库提供的类模板,它可以帮助程序员自动管理用new表达式动态分配的单个对象。auto_ptr对象被初始化为指向由new表达式创建的对象,当auto_ptr对象的生命期结束时,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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