C++之智能指针

07-21 851阅读

文章目录

    • 一:智能指针
      • 1:智能指针类型
      • 2:shared_ptr
      • 3:weak_ptr
        • 3.1环形依赖
        • 3.2 weak_ptr
        • 4:unique_ptr
          • 4.1 get(),release()和move()
          • 4.2 转移控制权
          • 4.3 在函数间传递unique_ptr
            • 4.3.1 只需要value
            • 4.3.2 传递unique_ptr
            • 4.4 作为函数返回值

              一:智能指针

              1:智能指针本身:智能指针是一个类模板的实例,通常作为局部变量存在于栈区(Stack)。当函数返回或者局部变量超出其作用域时,栈区的内存会被自动释放。

              C++之智能指针
              (图片来源网络,侵删)

              2:智能指针管理的对象:智能指针通常用来管理在堆区(Heap)上分配的内存。这是通过调用如new操作符来完成的。堆区的内存会一直存在,直到显式地释放它(使用delete操作符)或者当程序结束时才会被系统回收。

              1. c++对于普通的new或者malloc分配空间,需要及时的释放空间,否则容易造成内存泄漏,导致堆区空间不足。但是,随着代码量的增多,很容易忘记释放空间,于是智能指针应运而生。
              2. 智能指针会自动释放。省去手动管理内存。在智能指针中,会存在一个计数器,计数器的大小等于指向对象的智能指针的数量,当计数为0时,则释放指针。
              3. 智能指针在memory头文件中

              1:std::unique_ptr:它实现了对对象的独占所有权语义。这意味着一个unique_ptr在任何时候都指向一个对象,而且这个对象只能由一个unique_ptr拥有。当unique_ptr被销毁(例如离开其作用域)时,它所指向的对象也会被自动删除。

              2:std::shared_ptr:它实现了对象的共享所有权语义。多个shared_ptr可以指向同一个对象,并且每个shared_ptr持有一个引用计数。当最后一个指向某个对象的shared_ptr被销毁或重置时,该对象才会被删除。

              3:std::weak_ptr:它是对shared_ptr所管理对象的一个非拥有性引用,它指向一个由shared_ptr管理的对象,但并不影响对象的生命周期。也就是说,它不会增加所指向对象的引用计数。当最后一个指向对象的shared_ptr被销毁时,无论是否还有weak_ptr指向该对象,对象都会被删除。weak_ptr主要用于解决shared_ptr可能导致的循环引用问题。

              在这部分利用率局部变量的特性,C++的局部变量存在栈中,当变量的生命周期结束后,那栈会自动释放空间。而智能指针同样为局部变量,存在栈中。

              //很简单的一个类,帮助解释智能指针
              class Ball {
              public:
                  Ball() {
                      cout 
                      cout 
                      cout new int(100)};
                  //使用方式,和普通指针一样
                  shared_ptr};
              shared_ptr
                  string name;
                  int age;
                  shared_ptr
                      cout 
                  string name;
                  shared_ptr
                      cout 
                  auto principle = make_shared
                  weak_ptr
                      cout 
                      cout 
                  cout 
                  auto up = make_unique
                  cout 
                  auto up = make_unique
                  cout 
                  auto up = make_unique
                  cout 
                  auto up = make_unique
                  unique_ptr
                  unique_ptr
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]