C++之智能指针std::shared_ptr简单总结

std::shared_ptr的主要作用如下:

1、智能指针主要的用途就是方便资源的管理,自动释放没有指针引用的资源。

2、使用引用计数来标识是否有多余指针指向该资源。(注意,shart_ptr本身指针会占1个引用)

可以用shared_ptr.use_count()函数查看这个智能指针的引用计数,一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除

#include 
#include 
#include 


using namespace std;

class Student : public enable_shared_from_this
{
public:
	Student() {}
	~Student()
	{
		std::cout << "~Student被调用" << std::endl;
	}
	std::shared_ptr getStudent()
	{
		return shared_from_this();
	}
	std::string name;
	void setName(std::string name);
	std::string getName();
};

void Student::setName(std::string name)
{
	this->name = name;
}

std::string Student::getName()
{
	return name;
}

int main()
{
	int *p = new int(10);
	//std::shared_ptr ptr = p;这样赋值是错误的额,只要是智能指针,这样直接用=赋值是有问题的必须std::shared_ptr ptr(p);
	std::shared_ptr ptr(p);
	std::shared_ptr ptr1 = std::make_shared(15);
	std::shared_ptr ptr2(ptr1);
	//std::shared_ptr ptr2 = ptr1;这样赋值是错误的,只要是智能指针,这样直接用=赋值是有问题的必须std::shared_ptr ptr2(ptr1);
	std::cout << "ptr.use_count() is:" << ptr.use_count() << "  *ptr is:" << *ptr << std::endl;
	std::cout << "ptr1.use_count() is:" << ptr1.use_count() << "  *ptr1 is:" << *ptr1 << std::endl;
	std::cout << "ptr2.use_count() is:" << ptr2.use_count() << "  *ptr2 is:" << *ptr2 << std::endl;

	ptr2.reset();
	//这是时候ptr2已经销毁,指向的对象引用计数会减1,这个指针的不再指向任何对象,所以我们不能使用*ptr2了,下面一行代码使用肯定会报错,我先注释掉
	//std::cout << "ptr2.use_count() is:" << ptr2.use_count() << "*ptr2 is:" << *ptr2 << std::endl;
	std::cout << "ptr1.use_count() is:" << ptr1.use_count() << "   *ptr1 is:" << *ptr1 << std::endl;
	Student *stu = new Student();
	std::shared_ptr ptr_stu(stu);
	std::string name = "11";
	ptr_stu->setName(name);
	std::string result = ptr_stu->getName();
	std::cout << "ptr_stu.use_count() is:" << ptr_stu.use_count() << std::endl;
	std::cout << "my name is:"<

输出结果:

C++之智能指针std::shared_ptr简单总结_第1张图片

其中reset函数当智能指针调用了reset函数的时候,就不会再指向这个对象了,所以如果还有其它智能指针指向这个对象,那么另外一个智能指针的use_count()函数结果会减1。

为什么要用到enable_shared_from_this和shared_from_this,比如我们写一个普通的类,有析构函数,一个智能指针指向类对象的时候,我们析构函数会析购一次,然后智能指针会析构一次,析构两次就有问题

对enable_shared_from_this的说明可参考下面的文章:

https://blog.csdn.net/caoshangpa/article/details/79392878

你可能感兴趣的:(C++11)