ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【智能指针】

2022-01-31 00:03:25  阅读:158  来源: 互联网

标签:make 智能 内存 shared ptr 指针


1.背景
动态内存的使用很容易出问题,确保在正确的时间释放内存是极其困难的。忘记释放内存时会产生内存泄露;当尚有指针引用内存的情况下释放它,会产生引用非法内存的指针。
智能指针能自动释放所指向的对象。新的标准库提供了两种智能指针:
(1)shared_ptr:基于引用计数,允许多个指针指向同一个对象;
(2)unique_ptr:拷贝构造与赋值不能使用,实现独占的智能指针;
另外还有一个weak_ptr 弱引用,指向shared_ptr所管理的对象。

2.shared_ptr
智能指针是模板,使用时需要指定类型:
(1) 基本的使用

shared_ptr<string> p1;

有效性判断:

//判断智能指针p1是否为空,已经字符串是否为空
if(p1  && p1->empty())
{
    //do something
}

(2)更安全的使用方式
最安全的分配和使用动态内存的方法是调用:make_shared函数。当使用make_ptr时必须要指定对象类型:

shared_ptr<int> ptr_int = make_shared<int>(42);

使用make_shared的优势:共享指针管理对象本身,以及包含引用计数和其他管家数据的小对象。

  • make_shared可以分配单个内存块来保存这两个内存; 从指向已分配对象的指针构造共享指针将需要分配第二个块来存储引用计数,效率较高。
  • 使用make_shared意味着您根本不需要处理new和原始指针,从而提供更好的异常安全性,在分配对象之后但在将其分配给智能指针之前不可能抛出异常。
    (3)shared_ptr和new结合使用
    接受指针参数的智能指针构造函数是explicit的,不能将一个内置指针隐式转换为一个智能指针,必须使用直接初始化形式来初始化:
shared_ptr<int> p1 = new int(1024);   //错误:必须使用直接初始化形式
shared_ptr<int> p2(new int(1024));       //正确
  • 不要混合使用普通指针和智能指针;
  • 不要使用get初始化另外一个智能指针或为智能指针赋值;

标签:make,智能,内存,shared,ptr,指针
来源: https://blog.csdn.net/canon20070904/article/details/122728749

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有