美文网首页
C++11智能指针

C++11智能指针

作者: panjinya | 来源:发表于2020-06-25 20:23 被阅读0次

概述

智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。
C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr,其中后三个是C++11支持,并且第一个已经被C++11弃用。

原理

智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。

技术细节及使用方法

1.auto_ptr

所有权模式,C++11中已经废弃

2.unique_ptr

unique_ptr实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。它对于避免资源泄露特别有用。

unique_ptr<int> p1(new int(1));       //初始化方式1,注意类的构造函数初始化方式
unique_ptr<int> p2,p3;
p2 = unique_ptr<int>(new int(3));   //初始化方式2,注意这里用来初始化时使用的unique_ptr只是一个临时右值,初始化完就没有归属了,可以这么用
p3 = move(p2);                        //初始化方式3,将另一个unique_ptr的所有权转让给当前unique_ptr
p2 = unique_ptr<int>(new int(5));   //如果这里不再次初始化p2,后面不能访问p2,因为p2是空指针了
cout<<*p1<<*p2<<*p3<<endl;     //输出153
3.shared_ptr

shared_ptr实现共享式拥有概念。多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放。从名字share就可以看出了资源可以被多个指针共享,它使用计数机制来表明资源被几个指针共享。可以通过成员函数use_count()来查看资源的所有者个数。除了可以通过new来构造,还可以通过传入auto_ptr, unique_ptr,weak_ptr来构造。当我们调用release()时,当前指针会释放资源所有权,计数减一。当计数等于0时,资源会被释放。
shared_ptr 是为了解决 auto_ptr 在对象所有权上的局限性(auto_ptr 是独占的), 在使用引用计数的机制上提供了可以共享所有权的智能指针。

参考

相关文章

  • C++11智能指针

    [C++11]智能指针 C++11包括了三种智能指针: shared_ptr weak_ptr unique_pt...

  • C++ 智能指针

    C++智能指针[https://zhuanlan.zhihu.com/p/54078587] C++11中智能指针...

  • 现代 C++:一文读懂智能指针

    智能指针 C++11 引入了 3 个智能指针类型: std::unique_ptr :独占资源所有权的指针。...

  • 智能指针和垃圾回收

    堆内存管理:智能指针与垃圾回收 显式内存管理 野指针 重复释放 内存泄漏 C++11 的智能指针 unique_p...

  • C++之智能指针

    本文主要总结C++11中的几种智能指针的原理,使用及实现方式。 I、上帝视角看智能指针 1、智能指针的引用是为了方...

  • Caffe 架构学习-底层数据1

    前言 shared_ptr智能指针 为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Point...

  • C++ 11 常用特性的使用经验总结(二)

    4、智能指针内存管理 在内存管理方面,C++11的std::auto_ptr基础上,移植了boost库中的智能指针...

  • 使用 C++11 智能指针时要避开的 10 大错误

    我很喜欢C++11的智能指针。在很多时候,对很多讨厌自己管理内存的人来说是天赐的礼物。在我看来,C++11的智能指...

  • std::unique_ptr使用

    1 引言 std::unique_ptr是c++11起引入的智能指针,为什么必须要在c++11起才有该特性,主要还...

  • 智能指针学习

    智能指针 介绍 为了更容易(同时也更安全的管)的使用动态内存,C++11提供了智能指针来管理new出来的内存sha...

网友评论

      本文标题:C++11智能指针

      本文链接:https://www.haomeiwen.com/subject/zyekyhtx.html