#include <memory>
#include <iostream>
void VersionOne()
{
//malloc 资源分配不成功会返回一个空指针
//malloc 返回一个 (void*) // void*可以指向任何东西
//malloc 只分配内存没初始化
int* ageC = (int*)malloc(sizeof(int));
if (ageC) { }
free(ageC);
char* c = (char*)malloc(100);
free(c);
//new 做了2件事情,1分配资源 2 调用该类型的构造函数,进行初始化
int* age = new int(25);
int* height = new int(100);
std::cout << "Verson1 age=" << *age << std::endl;
//delete [] buffer; //数组
delete height;
delete age;
}
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;
//把智能指针作为一个值来传入
//作为值传入实际会对智能指针进行一次拷贝,use_cout会+1
void print(ObjectPtr obj)
{
std::wcout << "count " << obj.use_count() << " id " << obj->id() << std::endl;
}
//推荐引用方式
//把智能指针作为一个const引用传入,use_count不会发生变化
void printRef(const ObjectPtr& obj)
{
std::cout << "ref count " << obj.use_count() << " id " << obj->id() << std::endl;
}
//传入类引用
void printRef2(const Object& obj)
{
}
void deleterOfObject(Object* obj)
{
if (obj)
{
std::cout << "delete obj " << obj->id()<< std::endl;
}
delete obj;
}
void useDeleter()
{
//第二个参数是智能指针最后析构时候(没有人引用的时候)调用的函数释放资源
ObjectPtr obj(new Object(2), deleterOfObject);
ObjectPtr obj2 = obj;
}
//对于一个智能指针来说,他是一个值,出了作用域,一定会被析构
int main()
{
VersionOne();
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 is " << obj.use_count() << std::endl; //2
ObjectPtr obj3=obj;
std::cout << "ref count is " << obj.use_count() << std::endl; //3
//这个obj2所管理的智能指针不需要管理了,use_count()会减少1
obj2.reset();
obj2 = nullptr; //同上的意思
std::cout << "ref count is " << obj.use_count() << std::endl; //2
ObjectPtr obj4; //实际是一个裸指针
obj3.swap(obj4); //交换资源
//std::swap(obj3, obj4);
std::cout << "ref count is " << obj.use_count() << std::endl; //2
//判断有没有管理指针,返回管理的资源
auto p = obj.get(); //p是Object的裸指针
if (p)
{
std::cout << "id is " << p->id() << std::endl;
}
//直接把智能指针当做裸指针的用法来用,因为重载了operator bool
if (obj)
{
std::cout << "id is " << obj->id() << std::endl; //还是重载了 operator ->
std::cout << "ref id is " << (*obj).id() << std::endl; //operator *
}
obj4 = nullptr;
//obj.unique() 判断智能指针是不是只有一个人在使用
std::cout << "only one hold ptr " << obj.unique() << std::endl;
print(obj);
std::cout << "use_count " << obj.use_count() << std::endl;
printRef2(*obj);
}