第7章 Page442~446 7.8.9智能指针

news2024/12/23 15:35:30

指向堆内存的指针,很容易忘了释放:

int foo()
{
    int* p = new int(9);
    cout << *p << endl;
    return *p;
}

为什么要用指针

使用堆数据有以下几个目的(也可称为作用)如表7-18所列

表7-18 使用堆数据的常见目的
使用堆数据的目的作用说明示例附加说明
数据需要拥有超出当前代码块的生命周期多线程时传递给其他线程还未学习线程,暂不说明

在特定时机下初始化全局指针,例如:

int* p//全局变量

void foo()

{

        p = new int(9);

}

通常不推荐使用全局数据

作为全局容器的指针元素,例如:

list <int*> l; //全局容器

void foo()

{

        int* p = new int(9);

        l.push_back(p);

}

同上,并且通常也不太推荐在容器中存储基本类型数据的指针
需要传递到其他函数,由其他函数删除它在单线程的情况下,这种设计不太好,违背谁创建谁释放的原则
数据的状态表达,需要有“空”或“无”这个状态比如让一个人心里默想一个整数,然后还要有一个状态,表示他大脑防控,什么数都没想。光使用int无法表达这个状态,如果使用"int* p",可以让p为nullptr时表示放空状态指针为空的状态很常见,但通常不会仅仅为了多一个状态表达,而改为使用指针
所要使用的内存很大,必须使用堆内存

通常一个程序可用堆空间,要大于可用占空间。

例如下面这行代码,可能会让程序挂掉:

int a[665536]

改为,使用对空间则问题不大:

int* pa = new [665536];

推荐使用标准库容器,如array,vector, list等
需要在运行期才能决定所要分配的内存大小

int n;

cin >> n;

int* pa = new [n];

同上

直接给出的结论:

使用C++编写程序,如果没有用“面向对象”,则很大程度上不必要也不应该通过裸指针手工分配堆内存。

两个可怕的错误:

int foo()
{
    int* p = new int(9);
    cout << *p << endl;
    delete p; //我释放了哦

    return *p;
}

return时访问已经被释放的“*p”

int foo()
{
    int* p = new int;
    if(...)
    {
        *p = 10;
        return *p;
    }
    else
    {
        switch(...)
        {
            case 1:
                return 20;
            default:
                ...
        }
    }
    delete p;
    return 0;
}

函数中有一堆return,每个都可以结束函数,但除了最后一个,其他几个函数结束之前,都没有释放p。

怎么办?最简单的办法是,将例子中堆数据,都应该改成栈数据。

但是以后学习面向对象时,许多时候对象必须使用new创建,一不小心忘了释放,又该怎么办?有没有办法让一个对象在堆中创建,然后又会自动释放呢?

方法就是在堆中创建一个对象(称为po),然后在栈中也创建一个对象(称为Killer),然后把po交给killer来管理。

po当然可以就是“ int* ”这样简单的指针,

为了更清楚地观察对象的释放,我们为它定制下面这样的结构

然后,“O”类型的对象,交给另一个类Killer管理

对象释放时,会自动调用析构函数。定义一个Killer的栈变量,栈变量会自动释放,释放时会自动调用其析构函数,我们让析构函数负责删除po:

这个版本的“foo()”函数,创建了名为po的堆对象,后面却没有delete po的显式代码,但内存也没有泄露。因为k是栈对象,会自动释放,并会在临死之前,无情地将po干掉。

foo()运行效果

Killer的缺点:

killer管理的是“O*” ,如果要管理“int *”或其他,就得重写一个管理者

解决方案:

第一,C++有模板技术,可以只写一份代码,就能管理各种类型指针;第二,万一代码很长,程序员用着指针po,用着用着,就忘了之前将它托管给某个Killer的是,于是程序员很负责任地手工删除它:比如:

运行效果:可以看到内存被释放两次

怎么办?解决办法是:干脆不要po这个对象,在构建Killer对象是,直接new出一个无名对象作为入参:

运行效果:

至此还不能满意,因为好好的“po->HaHa()”不得不写成“k.po->HaHa”,有没有办法直接写作“k->HaHa()”呢?在C++中可以通过为Killer重载“->”这个操作符来实现

重载“->”的Killer例子:

事实上,C++已经为我们提供了很好的实现,术语上当然不是血腥的“Killer”,而是智能指针“smart pointer(智能指针)”,不管叫什么,一定要记得它是“管理者”被它管着的,称为“raw pointer(裸指针)”

智能指针分两种:

根据管理方式,C++智能指针又分成两种:一种是独占式智能指针。即一个裸指针,在同一个时间点,只允许有一个管理者。另一种是共享式智能指针,允许一个裸指针被多个智能指针同时管理。

标准库智能指针包含在“<memory>”头文件中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1452251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云服务器租用价格表(2024更新)

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

数据结构:4_二叉树

二叉树 一.树概念及结构 1. 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个**特殊的…

让你的资金运动起来,金钱的聪明处理方式

一、教程描述 本套教程主要讲解了金融思维和财务思维&#xff0c;常见投资工具的实操技巧&#xff0c;资产配置方案的制定方法&#xff0c;等等&#xff0c;将会重构你现有的投资观念&#xff0c;提升你认知的宽度和深度&#xff0c;可以轻松读懂财经新闻&#xff0c;不仅学会…

单片机学习笔记---LED呼吸灯直流电机调速

目录 LED呼吸灯 直流电机调速 模型结构 波形 定时器初始化函数 中断函数 主程序 上一节讲了电机的工作原理&#xff0c;这一节开始代码演示&#xff01; 我们上一篇说Ton的时间长Toff时间短电机会快&#xff0c;Ton的时间短Toff时间长电机会慢 并且我们还要保证无论Ton和…

红队ATKCK|红日靶场Write-Up(附下载链接)

网络拓扑图 下载地址 在线下载&#xff1a; http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ 百度网盘 链接&#xff1a;https://pan.baidu.com/s/1nlAZAuvni3EefAy1SGiA-Q?pwdh1e5 提取码&#xff1a;h1e5 环境搭建 通过上述图片&#xff0c;web服务器vm1既能用于外…

【网络安全】什么样的人适合学?该怎么学?

有很多想要转行网络安全或者选择网络安全专业的人在进行决定之前一定会有的问题&#xff1a; 什么样的人适合学习网络安全&#xff1f;我适不适合学习网络安全&#xff1f; 当然&#xff0c;产生这样的疑惑并不奇怪&#xff0c;毕竟网络安全这个专业在2017年才调整为国家一级…

【BUUCTF 加固题】Ezsql 速通

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

隐函数的求导【高数笔记】

1. 什么是隐函数&#xff1f; 2. 隐函数的做题步骤&#xff1f; 3. 隐函数中的复合函数求解法&#xff0c;与求导中复合函数求解法有什么不同&#xff1f; 4. 隐函数求导的过程中需要注意什么&#xff1f;

Day01 javaweb开发——tlias员工管理系统

任务介绍 完成部门管理和员工管理的增删改查功能 环境搭建 前端---->后端---->数据库 准备数据库表创建springboot工程&#xff08;web、mybatis、mysql驱动、lombok&#xff09;application.properties中引入mybatis配置信息&#xff0c;准备对应的实体类准备三层架…

Midjourney绘图欣赏系列(四)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

深入理解lambda表达式

深入理解ASP.NET Core中的中间件和Lambda表达式 var builder WebApplication.CreateBuilder(args); var app builder.Build(); app.Use(async (context, next) > { // Add code before request. await next(context);// Add code after request.}); 这段C#代码是用于设…

Mac M2芯片配置PHP环境

Mac M2芯片配置PHP环境 1. XAMPP2. PHPBrew(PHP版本管理)安装php7.4.33版本 3. 直接使用homebrew 安装php环境参考 1. XAMPP 官网地址 https://www.apachefriends.org/ 安装 安装完成 web server打开后&#xff0c;在打开localhost 成功&#xff01; 2. PHPBrew(PHP版本管…

node+vue3+mysql前后分离开发范式——实现视频文件上传并渲染

文章目录 ⭐前言⭐ 功能设计与实现💖 node上传文件写入file_map映射表💖 vue3前端上传文件回显⭐ 效果⭐结束⭐前言 大家好,我是yma16,本文分享关于 node+vue3+mysql前后分离开发范式——实现视频文件上传并渲染。 技术选型 前端:vite+vue3+antd 后端:node koa 数据库…

Python asyncio高性能异步编程 详解

目录 一、协程 1.1、greenlet实现协程 1.2、yield关键字 1.3、asyncio 1.4、async & await关键字 二、协程意义 三、异步编程 3.1、事件循环 3.2、快速上手 3.3、await 3.4、Task对象 3.5、asyncio.Future对象 3.5、concurrent.futures.Future对象 3.7、异步…

python+django+vue汽车票在线预订系统58ip7

本课题使用Python语言进行开发。基于web,代码层面的操作主要在PyCharm中进行&#xff0c;将系统所使用到的表以及数据存储到MySQL数据库中 使用说明 使用Navicat或者其它工具&#xff0c;在mysql中创建对应名称的数据库&#xff0c;并导入项目的sql文件&#xff1b; 使用PyChar…

软考 系统分析师系列知识点之信息系统战略规划方法(11)

接前一篇文章&#xff1a;软考 系统分析师系列知识点之信息系统战略规划方法&#xff08;10&#xff09; 所属章节&#xff1a; 第7章. 企业信息化战略与实施 第4节. 信息系统战略规划方法 7.4.7 价值链分析法 价值链分析&#xff08;Value Chain Analysis&#xff0c;VCA&am…

BulingBuling - 《研究巴菲特》 [ Buffettology ]

研究巴菲特 使沃伦-巴菲特成为世界上最著名的投资者的那些以前未曾解释过的技术 作者&#xff1a;玛丽-巴菲特 Buffettology The Previously Unexplained Techniques That Have Made Warren Buffett The Worlds Most Famous Investor By Mary Buffett 内容提要 《Buffetto…

php数据类型以及运算符

php数据类型以及运算符 1. php数据类型2. 使用举例3. 运算符 1. php数据类型 包括 String(字符串)、Integer(整型)、Float(浮点型)、Boolean(布尔型)、Array(数组)、Object(对象)、NULL(空值) 2. 使用举例 1.字符串 2.整型 3.浮点型 4.布尔型 5.数组 6.对象 7.null 3. 运算符…

AI:129-基于深度学习的极端天气事件预警

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

阿里云服务器服务费怎么计算的?详细报价解析

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…