03.C++内存管理笔记

1、C/C++内存分布

①内存分那么多区的原因:不同的数据,有不同的存储需求,各区域满足了不同的需求。

②存放:

临时变量等临时用的变量:栈区;

动态申请的变量:堆区;

全局变量和静态变量等整个程序期间都使用的变量:数据段;

常量、可执行代码等只读数据:代码段;

2、C语言中动态内存管理方式:malloc/calloc/realloc/free

3、C++内存管理方式

C语言的内存管理方式在C++中依然可以使用但是有些情况不方便,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

①new/delete操作内置类型

1°new操作符

动态开辟一个整型:

int* p=new int;

动态开辟一个整型同时赋个初值:

int* p=new int(3);

动态开辟多个整型:

int* p=new int[10];

动态开辟多个整型同时赋值:

int* p=new int[10]{1,2,3};

2°delete操作符

释放申请的一个空间:

delete p;

释放申请的多个空间:

delete[] p;

★new和delete,new[]和delete[]匹配起来使用;

★对于内置类型,malloc和new除了用法上的区别,没有别的区别;

②new/delete操作自定义类型

C语言的动态管理对于自定义类型是不好解决初始化的,所以必须要使用C++提供的new和delete

1°new操作符

动态开辟一个自定义类型:

A* p=new A;       //A是一个自定义的类

动态开辟一个自定义类型同时赋初值:

A* p=new A(1);       //自定义类型有传一个整型的构造函数

动态开辟多个自定义类型:

A* p=new A[3];          //开辟三个自定义类型的对象

动态开辟多个自定义类型同时赋初值:

A* p=new A[3]{1,2,3};         //隐式类型转换赋初值
A* p=new A[3]{aa1,aa2,aa3};     //利用已有的对象赋初值
A* p=new A[3]{A(1),A(2),A(3)};           //用匿名对象赋初值

★new的本质:开空间+调用构造函数初始化

2°delete 

释放申请的一个空间:

delete p;

释放申请的多个空间:

delete[] p;

★delete的本质:调用析构函数+释放空间

③new失败

1°new失败的话会抛出异常,但是异常需要捕获;

2°cout打印char*类型的数据的时候,默认打印的是字符串类型,想要打印地址可以使用printf或者前面加(void*)强制类型转换

4、operator new与operator delete函数

①new和delete是用户进行动态内存申请和释放的操作符,operator new和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层调用operator delete全局函数来释放空间。(这两个函数不是对new和delete的重载)

②operator new和operator delete封装的malloc和free。malloc失败了返回0,operator new失败了抛异常,这样更符合面向对象的特性。operator delete是为了和operator new配对。

5、new和delete的实现原理

①new和delete是操作符,运行时new直接转换成汇编指令,汇编指令中调用了operator new之后调用构造函数,delete直接转换成汇编指令,汇编指令中调用了析构函数之后,调用operator delete。

即:

new的原理:调用operator new函数申请空间

                     在申请的空间上执行构造函数,完成对象的构造

delete的原理:在空间上调用析构函数,完成对对象资源的清理工作

                        调用operator delete函数完成对象空间的释放

new[]的原理:调用1次operator new[]函数申请N个对象的空间   

                       在申请的空间上执行N次构造函数,完成对象的构造

                       ★开空间时会在空间的头部多开四个字节的空间。

                       ★多开四个字节空间是为了告诉delete[]调用析构函数时调用几次

delete[]的原理:在空间上调用N次析构函数,完成对对象资源的清理工作

                          调用1次operator delete函数完成对象空间的释放

                          ★释放空间时会向前减四个字节开始释放空间

▲如果使用new[]申请空间,使用delete释放空间,逻辑上一定是错的,但是可是报错,可能不报错。报错是因为,new[]申请空间时在空间的前面多申请了四个字节的空间,delete释放是没有从四个字节前开始释放,相当于从中间开始释放的,这是肯定会报错的。不报错的话,就是因为你的类没有显式的写析构函数,并且你的成员变量都是内置类型,new[]申请空间时前面没有多申请前面四个字节的空间,所以使用delete释放也是可以的,但是这属于编译器的优化,是编译器做的,不一样的编译器不一定做法相同。所以写的时候一定要注意匹配的问题。

6、定位new表达式(placemen-new)

①构造函数和析构函数都可以显式调用,析构函数像调用普通函数一样直接调用就好了,而构造函数像普通函数一样直接调用会报错,需要使用定位new来进行显式调用。

②定位new显式调用构造函数的主要场景:

一般定位new都是和内存池一起配合使用的,我们频繁去堆开辟一小块空间是效率非常低的,所以有了内存池的概念,内存池就是一次在堆中申请一块比较大的空间,然后我们创建对象时先去内存池看看空间够不够,空间不够就去堆中开辟,空间够就直接使用内存池内的空间,而内存池的空间是以前开辟的,所以是未初始化的,我们想要初始化就需要使用定位new来显式调用构造函数。

③使用格式:

new(place_address) type 或者new(place_address) type (Initializer_list)

place_address:必须是一个指针

initializer_list:是类型的初始化列表

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机图形学作业:四阶Bezier曲线、三阶 B 样条曲线

3. 请给出四阶Bezier曲线的矩阵表示形式,并作图绘制出一段四阶Bezier 曲线,要求给出控制点的坐标。(共 20 分) 四阶Bezier曲线的矩阵表示形式为: P(t)=P0P1P2P3P41-46-4104-1212-4006-1260004-4000011ttt3t4 给出控制点为: P0(578,389),P1(1018,175),P2(1442,373),P3(1…

【JaveWeb教程】(20) MySQL数据库开发之 基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询 详细代码示例讲解

目录 1. 数据库操作-DQL1.1 介绍1.2 语法1.3 基本查询1.4 条件查询1.5 聚合函数1.6 分组查询1.7 排序查询1.8 分页查询1.9 案例1.9.1 案例一1.9.2 案例二 在上次学习的内容中,我们讲解了: 使用DDL语句来操作数据库以及表结构(数据库设计&…

构建labelstudio镜像的时候,报错node:18,如何解决

解决方案: vi Dockerfile # syntaxdocker/dockerfile:1.3 FROM --platformlinux/amd64 node:18.16-bullseye-slim AS frontend-builder18改成 18.16-bullseye-slim

CodeWave智能开发平台--03--目标:应用创建--09供应商详情页面下

摘要 本文是网易数帆CodeWave智能开发平台系列的第13篇,主要介绍了基于CodeWave平台文档的新手入门进行学习,实现一个完整的应用,本文主要完成09供应商详情页面下主营产品展示及权限管理 CodeWave智能开发平台的13次接触 CodeWave参考资源…

UE 引擎工具笔记

2023虚幻技术分享会视频 1.2023年虚幻引擎最新功能和技巧 [UFSH2023]2023年虚幻引擎最新功能和技巧 | Chris Murphy Epic Games_哔哩哔哩_bilibili 推荐细看下.总结了UE5的功能大概 2.调试技巧 [UFSH2023]总有一个你不知道的虚幻引擎调试技巧 | 陈拓 Epic Games_哔哩哔哩_…

2024.1.11 Kafka 消息队列,shell命令,核心原理

目录 一 . 消息队列 二. Kafka 三 . 启动命令 四 . Kafka的Shell 命令 五 . Kafka的核心原理 1. Topic的分区和副本机制 2 . 消息存储机制 和 查询机制 3. Kafka中生产者数据分发策略 六 . Kafka 之所以具有高速的读写性能,主要有以下几个原因 七. 笔记…

8年经验之谈 —— 服务端性能瓶颈定位思路总结!

01、软件性能测试目标 软件性能测试的目的主要有以下三点: 评价系统当前性能,判断系统是否满足预期的性能需求。 寻找软件系统可能存在的性能问题,定位性能瓶颈并解决问题。 判定软件系统的性能表现,预见系统负载压力&#xff…

Asynchronous FIFO and synchronous FIFO-翻译自外网

Synchronous FIFO 先进先出 (FIFO) 是一种非常流行且有用的设计块,用于模块之间的同步和握手机制。 FIFO 的深度: FIFO 中的槽数或行数称为 FIFO 的深度。 FIFO 的宽度:每个槽或行中可以存储的位数称为 FIFO 的宽度。 在同步 FIFO 中&…

特征工程-特征清洗

特征清洗 在进行玩特征理解后,我们大致理解了面对的数据中包含哪些内容。下一阶段,我么需要对数据中的内容进行进一步分析处理,针对不同数据进行清洗。数据清洗是对数据进行重新审查和校验的过程,目的在于删除重复信息、纠正存在…

基于css实现动画效果

介绍 本文将会基于css&#xff0c;实现各种动画效果&#xff0c;接下来会从简单几个例子入手。 案例 三颗球 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><title>React App</title><style>…

软件测试|Python requests库的安装和使用指南

简介 requests库是Python中一款流行的HTTP请求库&#xff0c;用于简化HTTP请求的发送和处理&#xff0c;也是我们在使用Python做接口自动化测试时&#xff0c;最常用的第三方库。本文将介绍如何安装和使用requests库&#xff0c;以及一些常见的用例示例。 安装requests库 首…

Fenwick Tree——树状数组

问题陈述&#xff1a; 你得到一个长度为 N 的数组为 a0,a1,a2……an-1。处理以下类型的查询&#xff0c;一共有 Q 次查询。 0 p x : ap⬅ap x 1 l r : 打印 ai ( il 到 ir-1 的 ai 之和) 约束&#xff1a; 1 ≤ N,Q ≤ 500000 0 ≤ ai,x ≤ 1e9 0 ≤ p < N 0 ≤ li <…

算法训练营Day43(完全背包[组合排列])

完全背包理论 正序遍历&#xff0c;先背包先物品都可以&#xff0c; 正序遍历的话&#xff0c;之前的物品价值还在&#xff0c;可以用上。 物品和背包都是有前面推出来&#xff0c;都可以。 但是其他的非纯理论的完全背包问题就要看场景&#xff0c;确定先背包还是先物品了 //先…

Google Pixel 与 iPhone手机:哪个更好?

iPhone稳定可靠&#xff0c;Pixel性价比高且创新。两者各有千秋&#xff0c;满足不同需求 谷歌的 Pixel 手机是 Android 最接近 iPhone 的手机&#xff0c;也是真正原生的Android手机。在iPhone 15 Pro Max 与华为 Mate 60 Pro的比较中不难看出&#xff0c;iPhone依然有着极强…

SAP 获取物料/批次/订单的特性值(学习一)

1、事务码 MSC1N、MSC2N、MSC3N 2、常用表 MCH1、MCHA、AUSP、MCH*开头的几个 3、批次 1、创建批次 BAPI&#xff1a;BAPI_BATCH_CREATE 2、修改批次 BAPI&#xff1a;BAPI_BATCH_CHANGE 3、删除批次 BAPI&#xff1a;BAPI_BATCH_DELETE 4、获取批次明细 BAPI&…

vpp node 及 vpp 多线程

node 注册 node注册&#xff0c;即宏VLIB_REGISTER_NODE(x, ...)流程&#xff1a; 创建vlib_node_registration_t x&#xff1b;vlib_node_registration_t结构只是存放了用户提供的node相关信息。把x添加到全局变量vlib_global_main中的node_registrations链表中&#xff08;…

本地开发环境请求服务器接口跨域的问题(vue的问题)

上面的这个报错大家都不会陌生&#xff0c;报错是说没有访问权限&#xff08;跨域问题&#xff09;。本地开发项目请求服务器接口的时候&#xff0c;因为客户端的同源策略&#xff0c;导致了跨域的问题。下面先演示一个没有配置允许本地跨域的的情况&#xff1a; 可以看到&…

如何在数学建模竞赛中稳定拿奖

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

[三星电子]算法题--两种颜色涂无向图(bfs)

题目 题目描述&#xff1a; 给一无向图中各个节点绘色&#xff0c;一共只有两种颜色&#xff0c;使其满足相邻节点颜色不同&#xff0c;并输出其中一种颜色的节点个数及序号&#xff1b;如果不满足&#xff0c;则输出-1。 示例&#xff1a; 第一行输入节点个数V和边数E&…

数字信号处理实验---Z变换及系统的零极点分析 Matlab代码

一&#xff0e;各种函数的用法 1.tf2zp函数&#xff1a;通常用于将传递函数&#xff08;Transfer Function&#xff09;转换为零极增益形式&#xff08;ZPK form&#xff09;&#xff0c;转换前G(s) num(s) / den(s)&#xff0c;转换后G(s) K * (s - z1) * (s - z2) * ... *…