智能指针
智能指针需要具备三要素
a.RAII b.具备指针的功能 c.能够拷贝和赋值
使用智能指针的前提条件:利用当栈对象的生存周期结束时,会自动调用析构函数,来进行对对象的销毁;
问题:智能指针是在栈上创建还是在堆上创建?
答:智能指针本身在栈上,它指向的对象再堆上创建;进一个函数体内,调用构造函数new出来对象,出函数,自动调用析构delete对象
设计智能指针的类模板需要解决的问题:
1.* 运算符需返回引用,因为 *可以连续使用
2.* 和->的重载函数是没有形式参数的
template <typename T>
class SmartPtr{
public:
SmartPtr(T* ptr = NULL):_ptr(ptr){}
~SmartPtr() {delete _ptr; _ptr = NULL;}
T& operator*(){
return *_ptr;
}
const T& operator() const{
return *ptr;
}
T* operator->(){
return _ptr;
}
const T* operator->() const(){
return _ptr;
}
private:
T *_ptr;
};
int main(){
SmartPtr<int> p(new int(10));
*p = 20;
cout << "*p = " << *p << endl;
return 0;
}
auto_ptr(C++17 removed) unique_ptr share_ptr weak_ptr
auto_ptr get() 返回当前指针对象
release 情况当前智能指针对象,并返回类型指针;
reset 重置智能指针,把内存删除,且智能指针指向空;
std | boost | 功能说明 |
---|---|---|
unique_ptr | scoped_ptr | 独占指针对象,并保证指针所指对象声明周期与其一致 |
shared_ptr | shared_ptr | 可共享指针对象,可以复制给shared_ptr或weak_ptr。指针所指对象再所有的相关联的shared_ptr生命周期结束时结束,是强引用 |
weak_ptr | weak_ptr | 它不能决定所指对象的声明周期,引用所指对象时,需要lock()或shared_ptr才能使用 |