C++ 智能指针 shared_ptr 基础

#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);
}

猜你喜欢

转载自blog.csdn.net/m0_37981386/article/details/81090405
今日推荐