智能指针可分为:
- auto_ptr;
- shared_ptr
- unique_ptr
- weaked_ptr
其中auto_ptr已经废弃不用
shared_ptr的常用使用方式:
static void interface OfSharedPtr();
int main(){
interfaceOfSharedPtr();
}
class Object{
public:
Object(int id):m_id(id){std::cout<<"init obj "<<m_id<<std::endl;}
~Object(){std::cout<<"bye bye"<<m_id<<std::endl;}
int id() const {return m_id;}
private:
int m_id;
};
typedef std::shared_ptr<Object> ObjectPtr;
void deleteOfObject(Object* obj){
if(obj)
std::cout<<"delete obj "<<obj->id()<<std::endl;
delete obj;
}
void print (ObjectPtr obj){
std:cout<<"count"<<obj.use_count()<<"id"<<obj->id()<<std::endl;
}
void printRef(count ObjectPtr& obj){
std::cout<<"ref count"<<obj.use_count()<<"id"<<obj->id()<<std::endl;
}
void interfaceOfSharedPtr(){
ObjectPtr null;
std::cout<<"ref count is "<<null.use_count()<<std::endl;//0
ObjectPtr obj(new Object(1));
std::cout<<"ref count is "<<obj.use_count()<<std::endl;//1
ObjectPtr obj2(obj);
std:cout<<"ref count is"<<obj.use_count<<std::endl;//2
std:cout<<"ref count obj2 is"<<obj2.use_count<<std::endl;//2
ObjectPtr obj3 = obj;
std::cout<<"ref count is "<<obj.use_count()<<std::endl;//3
obj2.reset();//reset means what?
obj2= nullptr;
std::cout<<"ref count is "<<obj.use_count()<<std::endl;//2
auto p = obj.get();
if(p) {
std::cout<<"id is "<<p->id()<<std::endl;
}
if(obj) { // operator bool
std::cout<<"p id is"<<obj->id()<<std::endl; //operator ->
std::cout<<"ref id is"<<(*obj).id()<<std::endl; //operator *
}
obj4 = nullptr;
//if(obj.unique());
//if(obj.use_count() == 1)
std::cout<<"only one hold ptr "<<obj.unique()<<std::endl;
print(obj);
std::cout<<"ref count is"<<obj.use_count()<<std::endl; //2
printRef(obj);
}
shared指针提供自带user_count()函数:用于记录指针使用的人数;unique()函数用于判断当前使用的用户是否唯一。
用引用技术传入指针并不会改变外部指针的user_count否则以值的方式传入相当于拷贝会改变user_count
void print (ObjectPtr obj){
std:cout<<"count"<<obj.use_count()<<"id"<<obj->id()<<std::endl;
}
void printRef(count ObjectPtr& obj){
std::cout<<"ref count"<<obj.use_count()<<"id"<<obj->id()<<std::endl;
}
传const引用工作量最少,但有些时候也必须传值
默认当最后一个用户释放析构指针的时候会自动调用delete进行释放
也可以在new的时候传两个参数调用自己写的析构函数进行释放
void useDeleter(){
ObjectPtr obj(new Object(2), deleterOfObject);
ObjectPtr obj2 = obj;
}
void deleterOfObject(Object* obj){
if(obj)
std::cout<<"delete obj"<<obj->id()<<std::endl;
delete obj;
}
所以用shared_ptr不仅仅可以管理new,delete的资源也可以管理其他类似的资源