智能指针的探索

!!!对于基本类型来说,new和malloc(delete和free)一样,没区别

不是自定义就有问题,(除非自己定义析构,

#pragma once
//#include<iostream>
//#include<string>
//using namespace std;
////永远只有一个autoPtr指向它(管理内存),只有一个所有者
////库中int* p1=new int(1);auto_ptr<int>  ap1=p1;编译不通过(规范),可选择在构造函数前加关键字explicit
////autoPtr另一种实现,AutoPtr{T* _ptr; bool _owner;}
////AutoPtr容易野指针 AutoPtr<int> p1(new int(1));  if(1){ AutoPtr<int> ap2(p1);}p1变成了野指针
//template<class T>
//class  autoPtr
//{
//public:
//	autoPtr(T* ptr)
//		:_ptr(ptr)
//	{
//	}
//	autoPtr(autoPtr<T>& ptr)
//		:_ptr(ptr._ptr)
//	{
//		ptr._ptr = NULL;
//		
//	}
//	autoPtr& operator=(autoPtr<T> &ptr)
//	{
//		//if (this !=&ptr )
//		if (_ptr&&_ptr!=ptr._ptr)//防止指向同一空间(管理)
//		{
//			delete _ptr;
//			_ptr = ptr._ptr;
//		    ptr._ptr = NULL;
//		}
//		return *this;
//	}
//	void Display()
//	{
//		if(_ptr)
//			cout << (*_ptr) << endl;
//	}
//	~autoPtr()
//	{
//			delete _ptr;
//	}
//	T& operator*()
//	{
//		assert(_ptr);
//		return *_ptr;
//	}
//
//	T* operator->()
//	{
//		return _ptr;
//	}
//
//	T* GetPtr()
//	{
//		return _ptr;
//	}
//protected:
//	T* _ptr;
//};
////防拷贝,守卫指针,一个只能管理一处空间
//#pragma once
//#include<iostream>
//#include<string>
//template<class T>
//class ScopedPtr
//{
//public:
//	ScopedPtr(T* ptr)
//		:_ptr(ptr)
//	{
//
//	}
//	~ScopedPtr()
//	{
//		delete _ptr;
//	}
//	void Display()
//	{
//	    cout << (*_ptr) << endl;
//	}
//	T& operator*()
//	{
//		//assert(_ptr);
//		return *_ptr;
//	}
//
//	T* operator->()
//	{
//		return _ptr;
//	}
//
//	T* GetPtr()
//	{
//		return _ptr;
//	}
//protected:
//	T* _ptr;
//private:
//	//不让调用
//	ScopedPtr(const ScopedPtr<T>& s);
//	ScopedPtr& operator=(const ScopedPtr<T> s);
//};
//
////有单独空间,每个对象有自己的引用计数
//#pragma once
//#include<iostream>
//#include<string>
//class Count;
//template<class T>
//class SharedPtr
//{
//public:
//	SharedPtr(T* ptr)
//		:_ptr(ptr)
//		, _count(new int(1))
//	{}
//	SharedPtr(SharedPtr<T>& s)
//		:_ptr(s._ptr)
//		, _count(s._count)
//	{
//		++(*_count);
//	}
//	SharedPtr& operator=(SharedPtr<T>& s)
//	{
//		if (_ptr != s._ptr)
//		{
//			Destroy();
//			_ptr = s._ptr;
//			_count = s._count;
//			++s._count;
//		}
//		return *this;
//	}
//	~SharedPtr()
//	{
//		Destroy();
//	}
//	void Display()
//	{
//		cout << (*_ptr) << endl;
//	}
//	T& operator*()
//	{
//		//assert(_ptr);
//		return *_ptr;
//	}
//		
//	T* operator->()
//	{
//		return _ptr;
//	}
//		
//	T* GetPtr()
//	{
//		return _ptr;
//	}
//protected:
//	void Destroy()
//	{
//		if (--(*_count) == 0)
//			delete _ptr;
//	}
//protected:
//	T* _ptr;
//	int* _count;
//};

//测试用例
//#include"autoPtr.hpp"
//#include<iostream>
//#include<string>
//using namespace std;
//void Test1()
//{
//	int *p = new int(1);
//	autoPtr<int> p1(p);
//	autoPtr<int> p2(p1);
//	cout << (*p) << endl;
//	p1.Display();
//	p2.Display();
//}
//void Test2()
//{
//	int *p = new int(1);
//	autoPtr<int> p1(p);
//	int *p4= new int(2);
//	autoPtr<int> p3 = p4;
//	p3.Display();
//	p3 = p1;
//	p3.Display();
//}
//void Test3()
//{
//	string *p = new string("abc");
//	autoPtr<string> p1(p);
//	p1.Display();
//	autoPtr<string> p2(p1);
//	p2.Display();
//}
//void Test4()
//{
//	string *p = new string("abc");
//	autoPtr<string> p1(p);
//	p1.Display();
//	string *pst = new string("def");
//	autoPtr<string> p2(pst);
//	p2.Display();
//	autoPtr<string> p3(p1);
//	p3.Display();
//	p3 = p2;
//	p3.Display();
//}
//int main()
//{
//	Test4();
//	system("pause");
//	return 0;
//}

//#include"autoPtr.hpp"
//#include<iostream>
//using namespace std;
//#include<string>
////void Test1()
////{
////	int* p1 = new int(1);
////	ScopedPtr<int> p2(p1);
////	p2.Display();
////	cout << *p2 << endl;
////}
//
//void Test1()
//{
//	int *p1 = new int(1);
//	SharedPtr<int> p2(p1);
//	SharedPtr<int> p3(p2);
//	p2.Display();
//	p3.Display();
//}
//void Test2()
//{
//	int *p1 = new int(1);
//	SharedPtr<int> p2(p1);
//	SharedPtr<int> p3(p2);
//	p3.Display();
//	int *p4 = new int(2);
//	SharedPtr<int> p5(p4);
//	p3=p5;
//	p3.Display();
//}
//void Test3()
//{
//    string *p1 = new string("abc");
//	SharedPtr<string> p2(p1);
//	SharedPtr<string> p3(p2);
//	p3.Display();
//	string *p4 = new string("def");
//	SharedPtr<string> p5(p4);
//	p3 = p5;
//	p3.Display();
//}
//int main()
//{
//	Test3();
//	system("pause");
//	return 0;
//}


你可能感兴趣的:(智能指针)