02.02_111期_C++_数据内存分布笔记

operator new 和 operator delete是系统提供的全局函数
operator new是对malloc的封装
operator deleter是对free的封装

实际上在写出int* p2 = new int;这样的代码的时候,
 由于new是一个操作符,所以在编译的时候要转成对应的指令
 转成的指令就是operator new,这个operator new这个函数本质上和malloc是一样的
 
 写出ListNode* node1 = new ListNode(1);这样的代码的时候,
 new会申请空间,此时new转成的汇编指令中会先执行 operator new 和 再调用构造函数
 
 在写出int* p2 = new int[10];这样的代码的时候
 应该把new[10]看作是一个操作符,在编译的时候转成的汇编指令是operator new[]
 operator new[]会申请空间,其实现是operator new申请了10个int空间的函数
 
 写出ListNode* node2 = new ListNode[10];这样的代码的时候,
 new会申请空间,此时new转成的汇编指令是 operator new[] 
 此时的operator new[]实际上是先operator new 再调用构造函数,这样反复10次以后
 但是需要注意的是申请的空间是4 + 10 * sizeof(ListNode) 个字节的空间
 多开出来的4个字节的空间放的是对象个数,保证在使用delete[]进行释放时
 能够精准的释放之前申请的空间,delete[]在使用时不带参数
 之所以只有在释放自定义类型的空间时才会多申请4个字节(x86)
 这是因为需要对每个申请自定义类型的对象都调用析构函数
 如果这个类恰好是栈类,那么就需要把  在堆上申请的数组空间全部释放,
 那么释放多少次数组空间呢?只有通过这4个字节的空间中所存放的内容才能确定
 
 sizeof 和 strlen在底层上的不同
 sizeof 作为一个操作符,在编译时就会转成一堆指令,
 将内置类型或自定义类型按照规则算出所占字节数
 strlen 在生成可执行文件以后,在运行过程中按照库函数的逻辑返回一个值
 所以这两者的实现阶段都是不一样的

    对于申请了多个自定义对象在堆区后,要释放这些自定义对象所申请的空间
    应该使用delete[]
 

下面这两行代码说明了,
 new在申请了一块空间来放Stack中的_a, _top, _capacity之后
 如果要释放,必须是先释放_a指向的那块申请的整型数组空间
 然后再释放pst指向的自定义类型的空间,
 也就是说  delete是先将类中申请的空间释放(调用析构函数)
                     再把这个类所占的空间进行释放

1 有关c++内存分配堆栈

        1.1 栈区主要存在局部变量和函数参数,其空间的管理由编译器自动完成,无需手动控制,堆区是自己申请的空间,在不需  要时需要手动释放

        1.2栈区先定义的变量放到栈底,地址高,后定义的变量放到栈顶,地址低,因此是向下生长的,堆区则相反

        1.3 频繁的申请空间和释放空间,容易造成内存碎片,甚至内存泄漏,栈区由于是自动管理,不存在此问题

        1.4 32位系统下,最大的访问内存空间为4G,

2

        2.1 堆大小受限于操作系统,而栈空间一般有系统直接分配

        2.2 频繁的申请空间和释放空间,容易造成内存碎片,甚至内存泄漏,栈区由于是自动管理,不存在此问题

        2.3 堆无法静态分配,只能动态分配

        2.4栈可以通过函数_alloca进行动态分配,不过注意,所分配空间不能通过free或delete进行释放

3 下面代码的运行结果

ClassA *pclassa=new ClassA[5];delete pclassa;

申请对象数组,会调用构造函数5次,delete由于没有使用[],此时只会调用一次析构函数,但往往会引发程序崩溃

        4.1 new会申请空间,同时调用构造函数初始化对象,malloc只做一件事就是申请空间

        4.2 new/delete与malloc/free最大区别就在于是否会调用构造函数与析构函数

        4.3 new是保留字,不需要头文件,malloc是库函数,需要头文件malloc.h,只是平时这个头文件已经被其他头文件所包含了,用的时候很少单独引入,故错误

        4.4 new是操作符,malloc是函数

5 设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为

C c;void main(){A*pa=new A();B b;static D d;delete pa;}

全局变量和全局静态变量最先定义,局部静态变量之后定义,局部变量最后定义 

局部自定义类型最先析构,局部静态自定义类型之后析构,全局或全局静态自定义类型最后析构

6 下面程序的运行结果

char* p = new char[100];
delete p;

对于内置类型,并不存在构造函数和析构函数这一个环节,所以即使new char [100] 和 delete不匹配,也可以使用上述代码进行释放

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

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

相关文章

yolo导出的onnx怎么使用onnxruntime调用

1.上几篇文件,写了怎样标注数据,获取yolo数据,怎样训练数据。这篇文章写下,怎样使用yolo训练好的网络进行推理,怎样使用onnxruntime调用网络推理。 2.yolo模型训练后推理,主要分两种,一种是使用…

系统设计认知与常用方法(架构设计)

系统设计应该着重解决什么问题、回应哪些关切、如何演进、常用设计方法、如何落地? 系统设计认知 设计是需求与开发的连接点 解决复杂度 本质复杂度:问题本身的固有复杂度(不可避免)衍生复杂度:解决方法引入的额外…

HTTP相关问题

目录 1.从输入URL到页面展示到底发生了什么? 2.HTTP状态码有哪些? 2.1 2XX(成功状态码) 2.2 3XX(重定向状态码) 2.3 4XX(客户端错误状态码) 2.4 5XX(服务端错误状态码) 3.HTTP 请求头中常见的字段有哪些? 4.HTTP和HTTPS有什么区别&…

vue3-内置组件-Transition

基于状态变化的过渡和动画(常用) 建议多看几遍~~。然后动手去写写,学编程只有多动手才能有感觉。 内置组件: 它在任意别的组件中都可以被使用,无需注册。 Vue 提供了两个内置组件,可以帮助你制作基于状态变化的过渡和动…

EMC测试介绍

EMC测试介绍 EMC包括电磁干扰(EMI) 和抗电磁干扰(EMS)两个部分。发射干扰传导发射测试极限线以峰值检坡器测量时使用的决策树应用EN55022标准的波形示例测试仪器![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4580f693ae9a4f84891ece29681c7bf2.png) 辐射发射测试…

如何快速捕获和验证用户软件需求,实现快速迭代

在软件开发过程中,快速捕获和验证用户需求,以及迅速迭代功能,是保持项目敏捷性和用户满意度的关键。下面将介绍一些建议,帮助你在软件开发过程中更有效地满足用户需求。 1. 深入沟通与用户互动 要捕获用户需求,必须与…

Lua可变参数函数

基础规则 lua传入参数给一个function时采用的是“多余部分被忽略,缺少部分有nil补足”的形式: function f(a, b)return a or b endCALL PARAMETERS f(3) a3, bnil f(3, 4) a3, b4 f(3, 4, 5) a3, b4 (5 is discarded) unpack/pack…

CPU对数据库的性能影响

最近做了个CPU性能测试,测试语句如下 select count(*) from test01; ---44537344行数据,大概5.6GB 设置了参数alter system set "_serial_direct_read"never; 避免direct path read 为了避免物理IO的影响,多次反复运行,…

react 之 react.memo

React.memo 作用:允许组件在props没有改变的情况下跳过重新渲染 组件默认的渲染机制 默认机制:顶层组件发生重新渲染,这个组件树的子级组件都会被重新渲染 // memo // 作用:允许组件在props没有改变的情况下跳过重新渲染import…

敏捷开发交付绩效度量

在快速敏捷开发模式下,主要是要求技术能够快速响应,但并不是对质量没有要求,那么在又快又要质量好的前提下,如何去度量? 主要参考文章,软件交付效能度量 - Thoughtworks洞见 说明:如何在敏捷开…

npm淘宝镜像源换新地址

新的淘宝npm镜像源地址:https://registry.npmmirror.com 切换新的镜像源 npm config set registry https://registry.npmmirror.com然后再执行以下操作查看是否成功 npm config list如果没安装过淘宝镜像源的,则直接安装 npm install -g cnpm --regi…

JVM 性能调优 - 参数调优(3)

查看 JVM 内存的占用情况 编写代码 package com.test;public class PrintMemoryDemo {public static void main(String[] args) {// 堆内存总量long totalMemory Runtime.getRuntime().totalMemory();// jvm 试图使用的最大堆内存long maxMemory Runtime.getRuntime().maxM…

【Linux】Linux权限(下)

Hello everybody!在上一篇文章中,权限讲了大部分内容。今天继续介绍权限剩下的内容,希望大家看过这篇文章后都能有所收获! 1.更改文件的拥有者和所属组 对于普通用户,文件的拥有者和所属组都无权修改。 、 、 但root可以修改文件…

多账号运营为什么要使用动态住宅代理IP?

对于跨境有多账号运营需求的企业来说,选择正确类型的代理IP对于平稳运行至关重要。但最适合这项工作的代理类型是什么?为了更好地管理不同平台上的多个账户并优化成本,您可以选择动态住宅代理。 一、什么是动态住宅代理 动态住宅代理IP是互联…

图论:合适的环

4979. 合适的环 - AcWing题库 给定一个 n 个点 m 条边的无向图。 图中不含重边和自环。 请你在图中选出一个由三个点组成的环。 设图中一共有 x 条边满足:不在选择的环内,且与选择的环内某个点相连。 我们希望通过合理选环,使得 x 的值尽可能…

创新方案|经济下行周期下企业避免杀价内卷侵蚀利润亟需5种创新定价策略

随着通胀持续、全球经济衰退逆风让消费者谨慎支出,绝大多数企业都担心如何刺激购买且保持利润率。在本研究认为,公司不应该简单地调整价格,而应该创造性地借鉴其他行业定价打法,通过创新定价选项的组合,增加向客户计价…

LLM之RAG实战(二十二)| LlamaIndex高级检索(一)构建完整基本RAG框架(包括RAG评估)

在RAG(retrieval Augmented Generation,检索增强生成)系统中,检索到文本的质量对大型语言模型生成响应的质量是非常重要的。检索到的与回答用户查询相关的文本质量越高,你的答案就越有根据和相关性,也更容易…

QMUI_Android:提升Android开发效率与质量的利器

QMUI_Android:提升Android开发效率与质量的利器 在Android应用开发过程中,开发者常常面临着重复编写基础组件和处理兼容性问题的挑战,这不仅耗费时间,也降低了开发效率。为了解决这一问题,Tencent推出了QMUI_Android框…

突破编程_C++_面试(基础知识(7))

面试题16:什么是引用,它与指针有什么区别 引用是变量的别名。对于变量名而言,C 实际上对其是不作存储的,在汇编以后不会出现变量名,变量名作用只是用于方便编译器成汇编代码,是给编译器看的,同…

LeetCode、17. 电话号码的字母组合【中等,dfs回溯】

文章目录 前言LeetCode、17. 电话号码的字母组合【中等,dfs回溯】题目与类型思路递归回溯优化:StringBuilder来回溯补充代码:2024.1.31(简化) 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博…