当前位置: 首页 > news >正文

C++直接内存管理new和delete

0、前言

        C++语言定义了两个运算符来分配和释放动态内存。运算符new分配内存,delete释放new分配的内存。

1、new动态内存的分配

1.1、new动态分配和初始化对象

        1)、new内存分配        

        在自由的空间分配的内存是无名的,new无法为其分配的对象命名,而是返回一个指向该对象的指针。

int* pi = new int;//pi指向一个动态分配的,为初始化的无名对象。

        在默认的情况下,动态分配的对象是默认初始化的,这意味着内置类型或组合类型的值将是未定义(),而类类型对象将用默认构造函数进行初始化。

	std::string* ps = new std::string;//初始化为空的stringint* pi = new int;//pi指向未初始化的int

        2)、初始化对象   

        可以用直接初始化来初始化一个动态分配的对象,用圆括号或者列表初始化(花括号):

    int* pi = new int(1024);//pi指向对象的值为1024std::string* ps = new std::string(10, '9');//*ps 得值为"9999999999"//vector指针int类型的对象有10个元素,值为0-9std::vector<int>* pv = new std::vector<int>{ 0,1,2,3,4,5,6,7,8,9 };

        动态分配的对象值初始化,在类型名之后跟一对空括号即可: 

	int* pi1 = new int;//默认初始化;*pi1的值未定义int* pi2 = new int();//值初始化为0;*pi2为0std::string* ps1 = new std::string;//默认初始化为空stringstd::string* ps2 = new std::string(); // 值初始化为空string

        当提供括号包围的初始化器,可以用auto,但是只有当括号仅有单一初始化器是才可以用auto。

    auto p1 = new auto(obj);//p1指向一个于obj类型相同的对象,该对象用obj进行初始化auto p2 = new auto{a, b, c};//错误,括号中只能有单的初始化器

1.2、动态分配的const对象

        用new分配const对象是合法的。

	//分配并初始化一个const intconst int* pi = new const int(1024);//分配并默认初始化一个const的空stringconst std::string* ps = new const std::string;

        一个动态分配的const对象必须进行初始化。对于一个定义了默认构造函数的类类型,其const动态对象可以隐式初始化,而其他类型的对象就必须显示式初始化。由于分配的对象是const,new返回的指针是一个指向const的指针。

1.3、内存耗尽

        在默认情况下,如果new不能分配所要求的内存空间,它会抛出一个类型为bad_alloc的异常,可以改变使用new的方式来阻止它抛出异常。

​​​​​​​    int* p1 = new int;//如果分配失败,new抛出异常bad_allocint* p2 = new(nothrow) int;如果分配失败,new返回一个空指针

        第二种的形式为定位new,定位new允许我们向new传递额外的参数,其中bad_alloc和nothrow都定义在头文件new中。

2、delet释放动态内存

为了防止内存耗尽,在动态内存使用完后,必须将其归还给系统,通过delete表达式来将动态内存归还系统。delete表达式接受一个指针,指向我们想要释放的对象。

delete p1;//p1必须指向一个动态分配的对象或一个空指针

        delete表达式执行两个动作:销毁给定的指针指向的对象;释放对应的内存。

2.1、指针值和delete

2.2、动态对象的生存期

2.3、delete之后重置指针值

相关文章:

C++直接内存管理new和delete

0、前言 C语言定义了两个运算符来分配和释放动态内存。运算符new分配内存&#xff0c;delete释放new分配的内存。 1、new动态内存的分配 1.1、new动态分配和初始化对象 1&#xff09;、new内存分配 在自由的空间分配的内存是无名的&#xff0c;new无法为其分配的对象…...

Linux 内核中网络接口的创建与管理

在 Linux 系统中,网络接口(如 eth0、wlan0 等)是计算机与外部网络通信的桥梁。无论是物理网卡还是虚拟网络接口,它们的创建和管理都依赖于 Linux 内核的复杂机制。本文将深入探讨 Linux 内核中网络接口的创建过程、命名规则、路由选择以及内核如何将网络接口映射到实际的硬…...

人工智能 前馈神经网络练习题

为了构建一个有两个输入&#xff08; X 1 X_1 X1​、 X 2 X_2 X2​&#xff09;和一个输出的单层感知器&#xff0c;并进行分类&#xff0c;我们需要计算权值 w 1 w_1 w1​和 w 2 w_2 w2​的更新过程。以下是详细的步骤和计算过程&#xff1a; 初始化参数 初始权值&#xff1a…...

Windows搭建RTMP服务器

目录 一、Nginx-RTMP服务器搭建1、下载Nginx2、下载Nginx的RTMP扩展包3、修改配置文件4、启动服务器5、查看服务器状态6、其它ngnix命令 二、OBS推流1 、推流设置2、查看服务器状态 三、VLC拉流四、补充 本文转载自&#xff1a;Windows搭建RTMP服务器OBS推流VLC拉流_浏览器查看…...

Vue重新加载子组件

背景&#xff1a;组件需要重新加载&#xff0c;即重新走一遍组件的生命周期常见解决方案&#xff1a; 使用v-if指令&#xff1a;v-if 可以实现 true (加载)和 false (卸载) async reloadComponent() {this.show false// 加上 nextTick this.$nextTick(function() {this.show…...

【VScode】设置代理,通过代理连接服务器

文章目录 VScode编辑器设置代理1.图形化界面1.1 进入proxy设置界面1.2 配置代理服务器 2.配置文件&#xff08;推荐&#xff09;2.1 打开setting.json 文件2.2 配置代理 VScode编辑器设置代理 根据情况安装nmap 1.图形化界面 1.1 进入proxy设置界面 或者使用快捷键ctrl , 。…...

js es6 reduce函数, 通过规格生成sku

const specs [{ name: 颜色, values: [红色, 蓝色, 绿色] },{ name: 尺寸, values: [S, M, L] } ];function generateSKUs(specs) {return specs.reduce((acc, spec) > {const newAcc [];for (const combination of acc) {for (const value of spec.values) {newAcc.push(…...

基于R语言的DICE模型

DICE型是运用最广泛的综合模型之一。DICE和RICE模型虽然代码量不多&#xff0c;但涉及经济学与气候变化&#xff0c;原理较为复杂。 一&#xff1a;DICE模型的原理与推导 1.经济学 2.气候变化问题 3.DICE模型的经济学部分 4.DICE模型的气候相关部分 5.DICE模型的目标函数…...

【C】PAT 1006-1010

1006 换个格式输出整数 让我们用字母 B 来表示“百”、字母 S 表示“十”&#xff0c;用 12...n 来表示不为零的个位数字 n&#xff08;<10&#xff09;&#xff0c;换个格式来输出任一个不超过 3 位的正整数。例如 234 应该被输出为 BBSSS1234&#xff0c;因为它有 2 个“…...

力扣双指针-算法模版总结

lc-15.三数之和 &#xff08;时隔13天&#xff09; 目前可通过&#xff0c;想法上无逻辑问题&#xff0c;一点细节小错误需注意即可 lc-283.移动零&#xff08;时隔16天&#xff09; 总结&#xff1a;观察案例直觉就是双指针遇零交换&#xff0c;两次实现都通过了&#xff0c…...

解释一下:运放的输入偏置电流

输入偏置电流 首先看基础部分:这就是同相比例放大器 按照理论计算,输入VIN=0时,输出VOUT应为0,对吧 仿真与理论差距较大,有200多毫伏的偏差,这就是输入偏置电流IBIAS引起的,接着看它的定义 同向和反向输入电流的平均值,也就是Ib1、Ib2求平均,即(Ib1+Ib2)/2 按照下面…...

Windows 11 上通过 WSL (Windows Subsystem for Linux) 安装 MySQL 8

在 Windows 11 上通过 WSL (Windows Subsystem for Linux) 安装 MySQL 8 的步骤如下&#xff1a; ✅ 1. 检查 WSL 的安装 首先确保已经安装并启用了 WSL 2。 &#x1f527; 检查 WSL 版本 打开 PowerShell&#xff0c;执行以下命令&#xff1a; wsl --list --verbose确保 W…...

信用租赁系统助力企业实现免押金租赁新模式

内容概要 在现代商业环境中&#xff0c;信用租赁正在迅速崛起。通过结合大数据与区块链技术&#xff0c;信用租赁系统彻底改变了传统的租赁流程。什么是信用租赁呢&#xff1f;简单说&#xff0c;就是不需要押金&#xff0c;你也能够租到你想要的物品&#xff0c;这对企业和消…...

OSPF特殊区域(open shortest path first LSA Type7)

一、区域介绍 1、Stub区域 Stub区域是一种可选的配置属性。通常来说&#xff0c;Stub区域位于自治系统的边界&#xff0c;例如&#xff0c;只有一 个ABR的非骨干区域。在这些区域中&#xff0c;设备的路由表规模以及路由信息传递的数量都会大量减少。 kill 4 5类type 传递1 …...

Element-plus表单总结

表单包含输入框&#xff0c;单选框&#xff0c;下拉选择&#xff0c;多选框等用户输入的组件。输入表单&#xff0c;您可以收集、验证和提交数据。 经典表单 最基础的表单包括各种输入表单项&#xff0c;比如input、select、radio、checkbox等。 在每一个form组件中&#xff0…...

unity学习13:gameobject的组件component以及tag, layer 归类

目录 1 gameobject component 是unity的基础 1.1 类比 1.2 为什么要这么设计&#xff1f; 2 从空物体开始 2.1 创建2个物体 2.2 给 empty gameobject添加组件 3 各种组件和新建组件 3.1 点击 add component可以添加各种组件 3.2 新建组件 3.3 组件的操作 3.4 特别的…...

51单片机——中断(重点)

学习51单片机的重点及难点主要有中断、定时器、串口等内容&#xff0c;这部分内容一定要认真掌握&#xff0c;这部分没有学好就不能说学会了51单片机 1、中断系统 1.1 概念 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的&#xff0c;中断功能的存在&#…...

企业级Java 实体对象类定义规范

1. 查询参数类 (Query) 命名规则: xxxQuery.java用途: 用于封装查询操作的请求参数&#xff0c;通常包含分页、过滤、排序等字段。与数据库查询或 API 请求紧密相关。示例: ProductQuery.java、UserQuery.java使用场景: 查询条件的封装&#xff0c;发送查询请求时使用。 2. 返…...

【网络云SRE运维开发】2025第2周-每日【2025/01/07】小测-【第7章 GVRP链路捆绑】理论和实操

文章目录 一、理论题1.1 GVRP协议在华为设备中的主要作用是什么&#xff1f;1.2 在华为交换机上&#xff0c;配置GVRP时&#xff0c;端口的注册模式有哪些&#xff1f;并简要说明其特点。1.3 简述华为设备中GVRP协议的工作过程。1.4 在华为交换机上配置GVRP时&#xff0c;如果两…...

蓝桥杯算法|练习记录

位运算 按位与运算符&#xff08;&&#xff09; 运算规则&#xff1a;两位同时为1&#xff0c;结果才为1&#xff0c;否则结果为0。例如&#xff0c; -3&#xff08;在计算机中表示为1101&#xff09;&5&#xff08;0101&#xff09; 0101&#xff08;即十进制的1&…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...