赞
踩
std::shared_ptr的主要作用如下:
1、智能指针主要的用途就是方便资源的管理,自动释放没有指针引用的资源。
2、使用引用计数来标识是否有多余指针指向该资源。(注意,shart_ptr本身指针会占1个引用)
可以用shared_ptr.use_count()函数查看这个智能指针的引用计数,一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除
- #include <iostream>
- #include <memory>
- #include <string>
-
-
- using namespace std;
-
- class Student : public enable_shared_from_this<Student>
- {
- public:
- Student() {}
- ~Student()
- {
- std::cout << "~Student被调用" << std::endl;
- }
- std::shared_ptr<Student> 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<int> ptr = p;这样赋值是错误的额,只要是智能指针,这样直接用=赋值是有问题的必须std::shared_ptr<int> ptr(p);
- std::shared_ptr<int> ptr(p);
- std::shared_ptr<int> ptr1 = std::make_shared<int>(15);
- std::shared_ptr<int> ptr2(ptr1);
- //std::shared_ptr<int> ptr2 = ptr1;这样赋值是错误的,只要是智能指针,这样直接用=赋值是有问题的必须std::shared_ptr<int> 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<Student> 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:"<<result<< std::endl;
- return 0;
- }

输出结果:

其中reset函数当智能指针调用了reset函数的时候,就不会再指向这个对象了,所以如果还有其它智能指针指向这个对象,那么另外一个智能指针的use_count()函数结果会减1。
为什么要用到enable_shared_from_this和shared_from_this,比如我们写一个普通的类,有析构函数,一个智能指针指向类对象的时候,我们析构函数会析购一次,然后智能指针会析构一次,析构两次就有问题
对enable_shared_from_this的说明可参考下面的文章:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。