栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【智能指针】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【智能指针】

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

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

shared_ptr p1;

有效性判断:

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

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

shared_ptr ptr_int = make_shared(42);

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

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

shared_ptr p1 = new int(1024);   //错误:必须使用直接初始化形式
shared_ptr p2(new int(1024));       //正确

不要混合使用普通指针和智能指针;不要使用get初始化另外一个智能指针或为智能指针赋值;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/722594.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号