智能指针的使用以及原理(面试官让你写一个RAII)

1.RAII

RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句 柄、网络连接、互斥量等等)的简单技术

在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:

  • 不需要显式地释放资源。
  • 采用这种方式,对象所需的资源在其生命周期内始终保持有效

总结智能指针的原理

  • RAII特性
  • 重载operator*和opertaor->,具有像指针一样的行为

让我们用代码实现一个RAII

//使用RAII思想设计的SmartPtr类
template<class T>
class SmartPtr{
public:
	SmartPtr(T* ptr = nullptr)
		:_ptr(ptr)
	{}

	~SmartPtr()
	{
		if (_ptr)
			delete _ptr;
	}
private:
	T* _ptr;
};

void MergeSort(int* a, int n) {
	int* tmp = (int*)malloc(sizeof(int)*n);
	// 讲tmp指针委托给了sp对象,用时老师的话说给tmp指针找了一个可怕的女朋友!天天管着你,直到你go die   
	SmartPtr<int> sp(tmp);//RAII
	// _MergeSort(a, 0, n - 1, tmp); 
}

2.智能指针的原理

上述的SmartPtr还不能将其称为智能指针,因为它还不具有指针的行为。指针可以解引用,也可以通过->去 访问所指空间中的内容,因此:AutoPtr模板类中还得需要将* 、->重载下,才可让其像指针一样去使用 。

写一个智能指针

template<class T>
class SmartPtr{
public:
	SmartPtr(T* ptr = nullptr)
		:_ptr(ptr)
	{}

	~SmartPtr()
	{
		if (_ptr)
			delete _ptr;
	}
	//智能指针的第二个特性
	T& operator*()
	{
		return *_ptr;
	}
	T* operator->()
	{
		return _ptr;
	}
private:
	T* _ptr;
};

int main()
{
	SmartPtr<int> sp(new int);//RAII
	*sp = 10;
	cout << *sp << endl;

	system("pause");
	return 0;
}

总结一下智能指针的原理:

  1. RAII特性
  2. 重载operator*和operator->,具有像指针一样的行为。

你可能感兴趣的:(C++)