首页 > 编程语言 > 详细

C++智能指针

时间:2020-06-16 18:20:23      阅读:43      评论:0      收藏:0      [点我收藏+]

1.前言

C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用。

2.简介

智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。C++ 11中最常用的智能指针类型为shared_ptr,它采用引用计数的方法,记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配。当新增一个时引用计数加1,当过期时引用计数减一。只有引用计数为0时,智能指针才会自动释放引用的内存资源。对shared_ptr进行初始化时不能将一个普通指针直接赋值给智能指针,因为一个是指针,一个是类。可以通过make_shared函数或者通过构造函数传入普通指针。并可以通过get函数获得普通指针。

3.为什么使用智能指针

智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。手动管理内存带来的更严重的问题是,内存究竟要由谁来分配和释放呢?指针的赋值将同一对象的引用散播到程序各处,但是该对象的释放却只能发生一次。当在代码中用完了一个资源指针,该不该释放 delete 掉它?这个资源极有可能同时被多个对象拥有着,而这些对象中的任何一个都有可能在之后使用该资源,其余指向这个对象的指针就变成了“野指针”;那如果不 delete 呢?也许你就是这个资源指针的唯一使用者,如果你用完不 delete,内存就泄漏了。

资源的拥有者是系统,当我们需要时便向系统申请资源,当我们不需要时就让系统自己收回去(Garbage Collection)。当我们自己处理的时候,就容易出现各种各样的问题。

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

4.share_ptr

所在头文件: #include <memory>
//初始化:
      int a = new int(100);
      std::shared_ptr ptr(a);

//      使用make_shared初始化
      std::shared_ptr<int> ptr1 = std::make_shared<int>(15);

//综合案例
#include <iostream>
#include <string>
#include <memory>

using namespace std;
class Test
{
public:
    Test(string name)
    {
        name_ = name;
        cout << this->name_ << "  constructor" << endl;
    }
    ~Test()
    {
        cout << this->name_ << "  destructor" << endl;
    }

    string name_;
};


int main()
{
    /* 类对象 原生指针构造 */
    shared_ptr<Test> pStr1(new Test("object"));
    cout << (*pStr1).name_ << endl;
    /* use_count()检查引用计数 */
    cout << "pStr1 引用计数:" << pStr1.use_count() << endl;

    shared_ptr<Test> pStr2 = pStr1;
    cout << (*pStr2).name_ << endl;
    cout << "pStr1 引用计数:" << pStr1.use_count() << endl;
    cout << "pStr2 引用计数:" << pStr2.use_count() << endl;
    
    /* 先new 一个对象,把原始指针传递给shared_ptr的构造函数 */
    int *pInt1 = new int(11);
    shared_ptr<int> pInt2(pInt1);

    /* unique()来检查某个shared_ptr 是否是原始指针唯一拥有者 */
    cout << pInt2.unique() << endl; //true 1
    /* 用一个shared_ptr对象来初始化另一个shared_ptr实例 */
    shared_ptr<int> pInt3(pInt2);
    cout << pInt2.unique() << endl; //false 0
    
    cout << pInt3.use_count() << endl;
    cout << pInt2.use_count() << endl;
    return 0;
}

结果:
object constructor
object 
pStr1 引用计数:1
object 
pStr1 引用计数:2
pStr2 引用计数:2
1
0
2
2
object destructor

C++智能指针

原文:https://www.cnblogs.com/penuel/p/13143584.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!