03智能指针

时间:2020-04-17
本文章向大家介绍03智能指针,主要包括03智能指针使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
#include <iostream>
#include <memory>

using namespace std;

struct MyStruct
{
	MyStruct()
	{
		cout << "MyStruct() this:"<< this << endl;
	}
	~MyStruct()
	{
		cout << "~MyStruct()this:" << this << endl;
	}
};

void printSharedPtrInfo(const string& pName,  const shared_ptr<MyStruct>& sp)
{
	cout << pName.c_str() <<"\tuse_count():" << sp.use_count() << "\t";
	cout <<  sp.get() << endl;
}

void foo(const shared_ptr<MyStruct> sp)
{
	cout << "enter the function foo()" << endl;
	printSharedPtrInfo("sp",sp);
}

int main()
{
	//1.智能指针计数器递增
	cout << "test use_count increasing........................." << endl;
	//1.1.第一次将构造的对象赋值给sp,此时sp的引用计数为1
	auto sp = make_shared<MyStruct>();
	printSharedPtrInfo("sp",sp);						//use_count(): 1
	//1.2.进行一次赋值,引用计数+1,此时sp的引用计数为2
	auto sp1 = sp;
	printSharedPtrInfo("sp", sp);						//use_count(): 2
	//1.3.sp1与sp指向同一块内存,所以引用计数相同
	printSharedPtrInfo("sp2", sp1);					//use_count(): 2
	//1.4.进行一次拷贝构造,引用计数+1,此时sp的引用计数为3
	auto sp2(sp);
	printSharedPtrInfo("sp", sp);						//use_count(): 3
	printSharedPtrInfo("sp1", sp1);					//use_count(): 3
	printSharedPtrInfo("sp2", sp2);					//use_count(): 3
	//1.5.作为参数传递给一个函数,引用计数+1,此时函数内部引用计数为4
	foo(sp);									//use_count(): 4
	//1.6.离开函数作用域,函数内部局部对象被销毁,引用计数-1,此时引用计数为3
	printSharedPtrInfo("sp1", sp1);					//use_count(): 3

	//2.智能指针计数器递减
	cout << "test use_count reducing........................." << endl;
	//2.1.第一次将构造的对象赋值给sp,引用计数为1	
	auto spp = make_shared<MyStruct>();
	//2.2.进行一次赋值,引用计数+1
	auto spp1 = spp;
	printSharedPtrInfo("spp", spp);					//2
	{
		//2.2大括号作用域内,spp赋值给sp2,引用计数+1,此时spp的引用计数为2
		auto sp2 = spp;
		printSharedPtrInfo("spp", spp);				//3
	}
	//2.3.离开大括号作用域内,引用计数-1,	此时spp的引用计数为1
	printSharedPtrInfo("spp", spp);					//2
	
	//2.4.智能指针调用 reset,清零引用计数,并释放资源
	cout << "test reset()........................." << endl;
	spp.reset();
	printSharedPtrInfo("spp", spp);					//0

	printSharedPtrInfo("sp", sp);					//3
	//2.5.将一个应用计数为0的智能指针赋值给sp,则sp也清零引用计数,并释放资源
	sp = spp;
	printSharedPtrInfo("sp", sp);					//0
	printSharedPtrInfo("spp", spp);					//0

}

原文地址:https://www.cnblogs.com/rock-cc/p/12718797.html