为什么需要智能指针?
这个问题承接上一篇文章《C++ 堆,栈,RAII》,在RAII的指引下,我们需要实现一个类来管理资源,将资源和类对象的生命周期进行绑定,这样我们就可以不用手动释放资源了。
那为什么把类实现成 like pointer
?
上篇文章中说道,因为C++存在对象切片,而使用指针就避免了这个问题。
我们现在来实现一个智能指针:
首先,我们应该满足资源管理的需求: 构造函数获得资源,析构函数释放资源。
class Type
{
};
class smart_ptr
{
public:
smart_ptr(Type* ptr = NULL) : m_ptr(ptr) {
}
~smart_ptr() {
delete m_ptr;
}
private:
Type* m_ptr;
};
smart_ptr(new Type);
好了,我们这样就实现了一个可以管理 Type 类指针的 smart_ptr
。
显然,我们这个代码不够通用,只能管理 Type这个类型,我们把 smart_ptr 改成模板,把类型传进去,这样就通用了。
template<typename T>
class smart_ptr
{
public:
smart_ptr(T* ptr = NULL) : m_ptr(ptr) {
}
~smart_ptr() {
delete m_ptr;
}
private:
T* m_ptr;
};
我们只需要把smart_ptr(new Type);
改成 smart_ptr<Type>(new Type);
,就对Type进行了管理。
这样我们就实现了资源管理的功能,下面我们还需要实现like pointer
功能。
指针有什么操作?
T& operator*() const;
T* operator->() const;
operator bool() const;
我们需要实现指针的解引用,->
运算, bool
运算, bool
运算这里涉及到一个隐式转换的问题,有机会再说。 注意这里函数括号后面加上const
,表示当前成员函数不改变对象成员,这是个好习惯,不清楚的话可以看下我之前的文章。
template<typename T>
class smart_ptr
{
public:
smart_ptr(T* ptr = NULL) : m_ptr(ptr) {
}
~smart_ptr() {
delete m_ptr;
}
T& operator*() const {
return *m_ptr; }
T* operator->() const {
return m_ptr; }
operator bool() const {
return m_ptr; }
private:
T* m_ptr;
};
// 测试
class Type
{
public:
int a = 1;
};
smart_ptr<Type> sptr(