C++智能指针shared

    xiaoxiao2022-07-07  212

    1、智能指针的作用

    C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,智能指针的概念,方便管理堆内存。使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。

    从较浅的层面看,智能指针是利用了一种叫做RAII(资源获取即初始化)的技术对普通的指针进行封装,这使得智能指针实质是一个对象,行为表现的却像一个指针。

    智能指针的作用是防止忘记调用delete释放内存和程序异常的进入catch块忘记释放内存。另外指针的释放时机也是非常有考究的,多次释放同一个指针会造成程序崩溃,这些都可以通过智能指针来解决。

     

    2、std::shared_ptr

    头文件:

    #include <memory>

     

    3、创建方法

    std::shared_ptr<类型名>

     

    4、初始化方法

    一:创建对象初始化

    Student *s1 = new Student(); std::shared_ptr<Student> s2(s1);

    二:使用make_shared初始化

    std::shared_ptr<Student> sp3 = std::make_shared<Student>();

     

    三:

    std::shared_ptr<Student> sp4(new Student());

     

    5、use_count()函数

    返回引用计数的个数

    std::shared_ptr<Student> sp(new Student()); sp.use_count();

     

    6、unique()

    返回是否独占所有权(use_count为1)

    std::shared_ptr<Student> sp(new Student()); sp.unique();

     

    7、swap() 交换对象

    std::shared_ptr<Student> sp1(new Student()); std::shared_ptr<Student> sp2(new Student()); s1.swap(sp2);

    8、reset()

    放弃内部对象的所有权或拥有对象的变更, 会引起原有对象的引用计数的减少

    std::shared_ptr<Student> sp1(new Student()); sp1.reset();

    9、get()

    返回内部对象,未找到返回空

    sp.get();

    Demo: 

    #include <iostream> #include <memory> using namespace std; class Student { public: Student(){}; Student(int age){m_age = age;} ~Student(){ }; public: void print_age(){cout<<m_age<<endl;} private: int m_age; }; int main() { Student *sp1= new Student(20); std::shared_ptr<Student> sp2(sp1); std::shared_ptr<Student> sp3 = std::make_shared<Student>(20); //sp3->print_age(); std::shared_ptr<Student> sp4(new Student(10)); //sp4->print_age(); cout<<sp4.use_count()<<endl; std::shared_ptr<Student> sp5=sp4; std::shared_ptr<Student> sp6=sp4; cout<<sp4.use_count()<<endl; sp4.reset(); cout<<sp4.use_count()<<endl; return 0; }

     

    结果:

    g++ -o shared_test shared_test.cpp -std=c++0x ./shared_test 1 3 0

    参考:

    https://blog.csdn.net/u011068702/article/details/83692838

    https://www.cnblogs.com/diysoul/p/5930361.html

    https://en.cppreference.com/w/cpp/memory/shared_ptr

     

     

     

     

     

     

    最新回复(0)