条款13:关于文中多次提及的auto_ptr和shared_ptr

2023-10-21 18:10

本文主要是介绍条款13:关于文中多次提及的auto_ptr和shared_ptr,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

标题中提到的auto_ptr和shared_ptr以及unique_ptr都是智能指针,其中auto_ptr是C++98提供的解决方案,后两个是C++11提供的另外两种解决方案。

智能指针是行为类似于指针的类对象,但我们一般用他们来管理动态内存分配的智能指针模板。

智能指针模板都定义了类似指针的对象,可以将new获得(直接或间接)的地址赋给这种对象,当智能指针过期时,其析构函数将使用delete来释放内存。因此,如果将new返回的地址赋给这种对象,将无需记住稍后释放这些内存:在智能指针过期时,这些内存将自动被释放。

1.智能指针的使用

#include <iostream>
#include <memory>using namespace std;void demo1()
{double *pd=new double;    //为pd和一个double值分配存储空间,保存地址*pd=25.5;                 //将值复制到动态内存中return;                   //删除pd,值被保存在动态内存中
}void demo2()
{auto_ptr<double> *ap(new double);    //为ap和一个double值分配存储空间,保存地址*ap=25.5;                            //将值复制到动态内存中return;                              //删除ap,ap的析构函数释放动态内存
}


shared_ptr与unique_ptr和auto_ptr的使用方法类似。

#include <iostream>
#include <memory>
#include <string>class Report
{
private:std::string str;
public:Report(const std::string s) :str(s){std::cout << " Object created!" << std::endl;}~Report(){std::cout << "Object deleted!" << std::endl;}void comment() const{std::cout << str << std::endl;}
};int main()
{{   //作用域std::auto_ptr<Report> ps(new Report("using auto_ptr"));ps->comment();}{   //作用域std::shared_ptr<Report> ps(new Report("using shared_ptr"));ps->comment();}{   //作用域std::unique_ptr<Report> ps(new Report("using unique_ptr"));ps->comment();}return 0;
}



2.智能指针的隐式转换和显式转换

模板auto_ptr包含如下构造函数:

template<class X>
class auto_ptr
{
public:explicit auto_ptr(X* p = 0) throw();...
};
该构造函数是explicit构造函数,将指针作为参数,因此不能自动将指针转换为只能指针对象:

shared_ptr<double> pd;
double *p_reg=new double;
pd=p_reg;
上面写法就是传说中的隐式转换,这是不允许的。若进行显式转换,则可以:

pd=shared_ptr<double> (p_reg)
下面的隐式转换和显式转换也要注意:
shared_ptr<double> pshared=p_reg;  //不允许(隐式转换)
shared_ptr<double> pshared(p_reg);  //允许(显式转换)


3.智能指针的注意事项

1)全部三种智能指针都应避免一点:

string vacation("I wandered lonely as a cloud.");
shared_ptr<string> pvac(&vacation);   //错误

错误原因:pvac过期时,程序将把delete运算符用于非堆内存。(堆内存是什么鬼?)

所谓堆内存,是区别于栈区、全局数据区和代码区的另一个内存区域。该区允许程序运行时动态申请某个大小的内存空间。

2)auto_ptr的不足

先看下面赋值语句:

auto_ptr<string> ps (new string("test"));
auto_ptr<string> vocation;
vocation=ps;

如果ps和vocation是常规指针,则两个指针将指向同一个string 对象。这是不能接受的,因为程序将试图删除同一个对象两次---------一次是ps过期时,另一次是vocation过期时。要避免这种问题,方法有很多。

	//1.定义赋值运算符,使之执行深复制,这样两个指针将指向不同的对象,其中一个对象是另一个对象的副本。//2.建立所有权概念,对于特定的对象,只能有一个只能指针可以拥有它,这样只有拥有对象的智能指针的析构函数会删除该对象。这就是auto_ptr和unique_ptr的策略,但unique_ptr的策略更严格。//3.创建智能更高的指针,跟踪引用特定对象的智能指针数,这称为引用计数。仅当最后一个指针过期时才调用delete。这是shared_ptr采用的策略。



这篇关于条款13:关于文中多次提及的auto_ptr和shared_ptr的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/256071

相关文章

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

13 transition数组的动画使用

划重点 动画:transitiontransition-group :数组动画数组的 添加 / 删除 豆腐粉丝汤 清淡又健康 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><me

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的通关方法,大家不要自限思维! 2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路

Chapter 13 普通组件的注册使用

欢迎大家订阅【Vue2+Vue3】入门到实践 专栏,开启你的 Vue 学习之旅! 文章目录 前言一、组件创建二、局部注册三、全局注册 前言 在 Vue.js 中,组件是构建应用程序的基本单元。本章详细讲解了注册和使用 Vue 的普通组件的两种方式:局部注册和全局注册。 本篇文章参考黑马程序员 一、组件创建 ①定义 Vue 组件是一种具有特定功能的 Vue 实

VMware Fusion Pro 13 Mac版虚拟机 安装Win11系统教程

Mac分享吧 文章目录 Win11安装完成,软件打开效果一、VMware安装Windows11虚拟机1️⃣:准备镜像2️⃣:创建虚拟机3️⃣:虚拟机设置4️⃣:安装虚拟机5️⃣:解决连不上网问题 安装完成!!! Win11安装完成,软件打开效果 一、VMware安装Windows11虚拟机 首先确保自己的mac开启了网络共享。不然虚拟机连不上👀的 1️⃣:准备镜像

华为 HCIP-Datacom H12-821 题库 (13)

有需要题库的可以看主页置顶 1.可以携带外部路由的 tag 标签信息的是以下哪一类 LSA? A、4 类 LSA B、5 类 LSA  C、3 类 LSA  D、2 类 LSA 答案:B 解析: 暂无解析 2..两台路由器直连,并设定网络类型为 p2p 建立OSPF 邻居。那么两台路由器传输 OSPF 报文的目的 IP 地址是以下哪一项? A、使用组播地址 224.0.0.6 B

在项目中,控制权限保存时,如果多次修改权限,该如何写?

在项目中,控制权限保存时,如果多次修改权限,该如何写? 错误代码: package cn.itcast.crm.service.impl;import java.util.List;import javax.annotation.Resource;import org.apache.commons.lang.xwork.StringUtils;import org.springfr

[情商-13]:语言的艺术:何为真实和真相,所谓真相,就是别人想让你知道的真相!洞察谎言与真相!

目录 前言: 一、说话的真实程度分级 二、说谎动机分级:善意谎言、中性谎言、恶意谎言 三、小心:所谓真相:只说对自己有利的真相 四、小心:所谓真相:就是别人想让你知道的真相 五、小心:所谓善解人意:就是别人只说你想要听到的话 前言: 何为真实和真相,所谓真相,就是别人想让你知道的真相!洞察谎言与真相! 人与人交流话语中,处处充满了不真实,完全真实的只是其中一小部分,这

C++笔试强训12、13、14

文章目录 笔试强训12一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训13一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训14一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训12 一、选择题 1-5题 引用:是一个别名,与其被引用的实体公用一份内存空间,编译器不会给引用变量单独开辟新的空间。A错误 故选A。 A

error while loading shared libraries: libnuma.so.1: cannot open shared object file:

腾讯云CentOS,安装Mysql时: 1.yum remove libnuma.so.1 2.yum install numactl.x86_64