C++——关于new和delete

        在C语言中我们想要动态管理内存空间,需要使用到malloc/calloc/realloc/free这些函数,在 C++中有新的管理方式,那就是newdelete。new和delete是C++新定义的操作符,专门用于管理堆上的内存空间。

        new和delete在编译时,编译器会把这两个语句转换成两个call语句,去调用两个函数分别是operate newoperator delete,C++定义出这两个操作符不仅是为了方便操作,同时还实现了抛出异常的功能,通过查看源码我们可以知道起始operate new函数就是把malloc函数进行了一层包装,让他在申请空间的同时,能够初始化我们申请的这块空间,当new对象的类型是自定义类型时,还会调用它的构造函数,同时如果申请空间失败时,operate new函数还会抛出一个异常。同样的,简单来看operator delete函数也是对_free_dbg函数进行了一层封装,而在C语言中free时一个宏函数,它的原型也就是这个_free_dbg函数,operator delete函数在释放空间之前,如果释放的对象是一个自定义类型,那operator delete函数还会调用它的析构函数。

        一般来说newdelete搭配使用,new[]delete[]一起搭配使用。如果是使用new[]实例化多个多个对象,那么有几个对象就会调用几次构造函数,同样delete[]释放几个对象,就会调用几次析构函数。如果进行混合使用,在对象时内置类型对象时不会出错,当对象是自定义类型的对象时,运行就会报错。

#include<iostream>
using namespace std;class A
{
public:A(int a = 0){_a = a;cout << "A()" << endl;}~A(){cout << "~A()" << endl;}
private:int _a;
};
int main()
{A* pa = new A[5];delete a;return 0;
}

        这里会报错的原因和调用析构函数的次数没有关系,这里我们先明确一点,编译器在处理一次性new一个自定义类型数组对象的时候,会在这个数组的头部多开一部分空间,用来存储这个数组中共有几个对象,在new好对象以后,编译器会把第一个对象的地址,也就是这个数组的首元素地址返回给我们的指针也就是pa,但是这个pa并不是我们申请的这块内存的起始地址,我们申请的这个数组的内存空间是连续的,我们如果要释放一块连续的内存空间,是不能从中间开始释放的,如果我们调用的是delete[],那delete[]会自动的把我们的指针调整回这块空间的起始位置,也就是我们存储对象个数的那个地址,这样在释放的时候就不会出错了。

        那为什么有的时候就不会报错呢?这个是因为如果我们没有自定义析构函数,编译器会认为这个自定义类型中用到的类型都是内置类型,并且没有指向资源,所以在释放空间的时候就不需要调用构造函数,这个时候在new对象数组的时候,就不会在开头的位置多申请一块空间来保存数组中的对象个数。所以这个时候指针的位置就是我们申请的空间的起始位置,就不会出错了。从这里我们也可以看出,在申请空间时多开的空间保存的个数是给delete[]使用。所以new和delete、new[]和delete[]最好不要混合使用

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

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

相关文章

Linux C++ 055-设计模式之状态模式

Linux C 055-设计模式之状态模式 本节关键字&#xff1a;Linux、C、设计模式、状态模式 相关库函数&#xff1a; 概念 状态模式&#xff08;State Pattern&#xff09;是设计模式的一种&#xff0c;属于行为模式。允许一个对象在其内部状态改变时改变它的行为。对象看起来似…

Rust RefCell<T> 和内部可变性模式

内部可变性&#xff08;Interior mutability&#xff09;是 Rust 中的一个设计模式&#xff0c;它允许你即使在有不可变引用时也可以改变数据&#xff0c;这通常是借用规则所不允许的。为了改变数据&#xff0c;该模式在数据结构中使用 unsafe 代码来模糊 Rust 通常的可变性和借…

移动UI:具备什么特征,可以被认定为科技风格。

移动UI设计在科技风格上通常具备以下特征&#xff1a; 1. 清晰简洁的排版&#xff1a; 科技风格的移动UI通常采用清晰简洁的排版&#xff0c;注重信息的层次感和结构化&#xff0c;以便用户能够快速、直观地获取所需信息。 2. 几何形状和线条&#xff1a; 科技风格的移动UI常…

【算法】代码随想录之哈希表(更新中)

文章目录 前言 一、有效的字母异位词&#xff08;LeetCode--242&#xff09; 二、两个数组的交集&#xff08;LeetCode--349&#xff09; 前言 跟随代码随想录&#xff0c;学习哈希表相关的算法题目&#xff0c;记录学习过程中的tips。 一、有效的字母异位词&#xff08;Le…

HashMap的扩容原理

1.7版本 1.先生成新数组 2.遍历老数组中的每个位置上的链表上的每个元素 3.取每个元素的key&#xff0c;并基于新数组长度&#xff0c;计算出每个元素在新数组中的下标 4.将元素添加到新数组中去 5.所有元素转移完了之后&#xff0c;将新数组赋值给HashMap对象的table属性 1.8版…

conda 复现论文部署环境常用操作

conda创建环境 conda create -n baichuan python3.9#不要创建环境&#xff0c;新创建的环境都没有关联cuda。可以复制原本就有cuda的环境 conda create -n 新环境名 --clone 旧环境名conda删除、查看环境 conda env list conda remove -n baichuan --all 停用环境 conda dea…

更新:彩虹云商城系统 自助下单免授权无后门源码(修复完整版)

源码简介&#xff1a; 最新更新彩虹云商城系统&#xff0c;自助下单免授权无后门源码&#xff08;修复完整版&#xff09; 自助下单彩虹云商城系统。这玩意儿不简单&#xff0c;它是高效稳定的电商平台&#xff01;免授权源码版本&#xff0c;灵活方便。源码是用PHP语言写的。…

如何在SpringCloud中优雅实现服务注册与发现

Spring Cloud提供了一个名为Eureka的服务注册与发现组件&#xff0c;可以帮助我们在微服务架构中实现服务注册与发现的功能。在本文中&#xff0c;我将介绍如何在Spring Cloud中使用Eureka实现服务注册与发现&#xff0c;并通过一些优雅的方式来进行配置和使用。 首先&#xf…

定期整理pycharm相关缓存

缘起&#xff1a;下载一个数据集之后&#xff0c;点了虚拟机&#xff0c;直接卡住了&#xff0c;第二屏黑了&#xff0c;然后放到桌面&#xff0c;用电脑管家查了下&#xff0c;结果一直再查pycharm下的remote_sources https://blog.csdn.net/lt_BeiMo/article/details/124159…

迅为3A5000_7A2000ATX标准DIY国产龙芯电脑

性能强 采用全国产龙芯3A5000处理器&#xff0c;基于龙芯自主指令系统 (LoongArch)的LA464微结构&#xff0c;并进一步提升频率&#xff0c;降低功耗&#xff0c;优化性能。 桥片 采用龙芯 7A2000&#xff0c;支持PCIE 3.0、USB 3.0和 SATA 3.0.显示接口2 路、HDMI 和1路 VGA&a…

超算网络体系架构-资源层-平台层-服务层-应用层

目录 超算网络体系架构 我国超算基础设施 超算互联网相关标准研制方面 技术架构 资源层 基础资源 芯片多样 体系异构 高效存储 高速互连 资源池化 可隔离 可计量 互联网络 高带宽 低时延 高安全 平台层 算力接入 资源管理 算力调度 用户管理 交易管理 模…

计算机网络入门 --网络模型

计算机网络入门 --网络模型 1.OSI七层模型 1.1 模型概念 OSI七层模型是将计算机网络通信协议划分为七个不同层次的标准化框架&#xff0c;每一层都负责不同功能&#xff0c;并从物理连接层开始处理。OSI七层网络模型如下分别为&#xff1a;物理层、数据链路层、网络层、传输…

【linux】报错解决:配置RAIDA1之后系统识别不到

【linux】报错解决&#xff1a;配置RAIDA1之后系统识别不到 一、问题描述&#xff1a; 我的主板是华南金牌X99-F8D PLUS&#xff0c;安装了ubuntu20.04&#xff0c;通过BIOS创建了RAID1数组&#xff0c;进入系统之后识别不到我创建的RAID1数组。 二、原因分析&#xff1a; 可…

MySQL基础查询(DQL)

在查询之前&#xff0c;先看一下我的表内容和数据,一下都是参照我的表的数据来做个样例。我这个表名我自己起为emp 1.查询多个字段 &#xff08;1&#xff09;这个也就是可以随机想查自己想要的字段&#xff0c;可以是全部 SELECT 字段1,字段2,字段3..... FROM 表名例如我想…

RK3568 V1.4.0 SDK,USB OTG端子不能被电脑识别出adb设备,解决

修改后的/usr/bin/usbdevice: #!/bin/sh # # Usage: # usbdevice [start|update|stop] # # Hookable stages: # usb_<pre|post>_<init|prepare|start|stop|restart>_hook # <usb function>_<pre|post>_<prepare|start|stop>_hook # # Example …

Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码

章节内容 上节我们完成了&#xff1a; ZooKeeper的Leader选举机制ZooKeeper的选举过程ZooKeeper的ZAB协议 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff0…

【Linux】多线程_9

文章目录 九、多线程10. 线程池 未完待续 九、多线程 10. 线程池 这里我没实现一些 懒汉单例模式 的线程池&#xff0c;并且包含 日志打印 的线程池&#xff1a; Makefile&#xff1a; threadpool:Main.ccg -o $ $^ -stdc11 -lpthread .PHONY:clean clean:rm -f threadpoolT…

element ui中el-form-item的属性rules的用法

目录 el-form-item的属性rules的用法 栗子 总结 实践应用 一、 定义静态的校验规则 二、定义动态的校验规则 el-form-item的属性rules的用法 在学习element ui 的Form表单组件时&#xff0c;学到el-form-item也有rules属性&#xff0c;但是对应这个属性如何使用&#x…

使用Spring Boot和RabbitMQ实现消息驱动微服务

使用Spring Boot和RabbitMQ实现消息驱动微服务 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨如何利用Spring Boot和RabbitMQ构建消息驱动的微服务架构&#xff0c;这是现代分布式…

Databend 开源周报第 153 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend。 支持必须更改密码…