智能指针

为什么有智能指针?

由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。可是程序员容易忘记 delete,最终导致没有 delete,程序异常。用智能指针便可以有效缓解这类问题。

接下来讲3种智能指针:Auto_ptr、ScopedPtr、SharedPtr.

(1)Auto_ptr:

1.auto_ptr在构造时获取对某个对象的所有权,在析构时释放该对象。我们可以这样使用auto_ptr来提高代码安全性.

2.在拷贝构造或赋值操作时,auto_ptr的做法是“所有权转移”,即拷贝或赋值的源对象将失去对“裸”指针的所有权

3.与一般拷贝构造函数,赋值函数不同,auto_ptr的拷贝构造函数,赋值函数的参数为引用而不是常引用(const).

4.一个auto_ptr不能同时拥有两个以上的“裸”指针,所以,拷贝或赋值的目标对象应该先释放其原来所拥有的对象。


  (2)ScopedPtr

ScopedPtr是通过把拷贝构造或赋值操作设为私有,使外部不能调用.下面我将把它的代码实现写在下面

  (3)SharedPtr

SharedPtr是利用引用计数

#include<iostream>
using namespace std;
template<class T>
class ScopedPtr
{
public:
	ScopedPtr();
	ScopedPtr(T* ptr);
	T& operator*();   //记得加&
	T* operator->();
	~ScopedPtr();
private:
	ScopedPtr<T>(const ScopedPtr<T>& sp);
	ScopedPtr<T>& operator=(const ScopedPtr<T>& sp);
private:
	T* _ptr;
};
template<class T>
ScopedPtr<T>::ScopedPtr()
	:_ptr(NULL)
{}
template<class T>
ScopedPtr<T>::ScopedPtr(T* ptr)
	:_ptr(ptr)
{}
template<class T>
T& ScopedPtr<T>::operator*()   //记得加&
{
	return *_ptr;
}
template<class T>
T* ScopedPtr<T>:: operator->()
{
	return _ptr;
}
template<class T>
ScopedPtr<T>::~ScopedPtr()
{
	delete _ptr;
	_ptr=NULL;
}

void Test()
{
	int *p1=new int[5];
	ScopedPtr<int> sp1(p1);
	*p1=1;
	cout<<*sp1<<endl;
}
int main()
{
	Test();
	system("pause");
	return 0;
}



你可能感兴趣的:(SmartPtr)