C和C++内存管理

目录:
一:C和C++内存分布
二:C动态内存管理方式
三:C++动态内存管理方式
四:operator newoperator delete函数
五:newdelete的实现原理
六:定位new表达式(placement-new)
七:经典面试题

思维导图:

1:C和C++内存分布

接下来我们来做个题:

 以下变量存放在哪一个区域:

问题1:

 globalVar在哪里?____   staticGlobalVar在哪里?____
   staticVar在哪里?____   localVar在哪里?____
   num1 在哪里?____

问题2:

 sizeof ( num1 ) = ____ ;  
sizeof ( char2 ) = ____ ;       strlen ( char2 ) = ____ ;
sizeof ( pChar3 ) = ____ ;     strlen ( pChar3 ) = ____ ;
sizeof ( ptr1 ) = ____ ;

注解:

1.)又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。
2. )内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口
创建共享共享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下)
3. )用于程序运行时动态内存分配,堆是可以上增长的。
4.) 数据段(也被称为数据区、静态数据区、静态区)--存储全局数据和静态数据
5.) 代码段(常量区)--可执行的代码/只读常量 

2:C动态内存管理方式
void Test ()
{
int* p1 = (int*) malloc(sizeof(int));
free(p1);int* p2 = (int*)calloc(4, sizeof (int));
int* p3 = (int*)realloc(p2, sizeof(int)*10);free(p3 );
}
2.1 malloc,realloc,calloc 区别

malloc:在堆上开辟一块空间

realloc:进行对空间的扩容,可能原地扩,也可能异地扩

calloc:开辟空间并把开好 的空间进行初始化

2.2 动态开辟的内存需要frre? 

毋庸置疑的,必须进行释放,否则会造成内存泄漏

3:C++动态内存管理方式
   通过new和delete操作符进行动态内存管理。
3.1 对内置类型的处理

     //注意:申请和释放单个元素的空间,使用new和delete操作符后面加变量名字,
    // 申请和释放连续的空间,使用new[]和delete[]在加名字,
    //注意:匹配起来使用。

3.2对自定义类型的处理

 对于自定义类型的delete 和内置类型的销毁是不一样的在底层逻辑上:

注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。

4:operator newoperator delete函数

new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是
系统提供的
全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。

operator new 实际也是通过malloc来申请空间,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。operator delete 最终是通过free来释放空间的。

5:newdelete的实现原理

new , delete 对自定义类型的处理机制

new 的原理
1. 调用 operator new 函数申请空间
2. 在申请的空间上执行构造函数,完成对象的构造
delete 的原理
1. 在空间上执行析构函数,完成对象中资源的清理工作
2. 调用 operator delete 函数释放对象的空间
new T[N] 的原理
1. 调用 operator new[] 函数,在 operator new[] 中实际调用 operator new 函数完成 N个对
象空间的申请
2. 在申请的空间上执行 N次构造函数
delete[ ] 的原理
1. 在释放的对象空间上执行 N 次析构函数,完成 N 个对象中资源的清理
2. 调用 operator delete[] 释放空间,实际在 operator delete[] 中调用 operator delete 来释
放空间
6:定位new表达式(placement-new)

定位 new 表达式是在 已分配的原始内存空间中调用构造函数初始化一个对象
使用格式:
new (place_address) type 或者 new (place_address) type(initializer-list)
place_address 必须是一个指针, initializer-list 是类型的初始化列表
使用场景:
定位 new 表达式在实际中一般是 配合内存池使用 。因为内存池分配出的内存没有初始化,所以如 果是自定义类型的对象,需要使用new 的定义表达式进行显示调构造函数进行初始化。
7:经典面试题
7.1malloc,free 和new , delete区别
malloc/free new/delete
共同点是:都是从堆上申请空间,并且需要用户 手动释放
不同的地 方是
1. malloc free 函数 new delete 操作符
2.  初始化问题:   malloc 申请的空间不会初始化, new 可以初始化
3. malloc 申请空间时,需要手动计算空间大小并传递, new 只需在其后跟上空间的类型即可如果是多个对象,[ ] 中指定对象个数即可
4.  是否强转 : malloc 的返回值为 void*, 在使用时必须强转, new 不需要,因为 new 后跟的是空间的类型
5.  是否判空 : malloc 申请空间失败时,返回的是 NULL ,因此使用时必须判空, new 不需要,但是 new 需 要捕获异常
6.  是否额外调用函数 : 申请自定义类型对象时, malloc/free 只会开辟空间,不会调用构造函数与析构函数,而 new 在申请空间后会调用构造函数完成对象的初始化,delete 在释放空间前会调用析构函数完成 空间中资源的清理
7.2内存泄漏定义以及危害
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序 未能释放已经不再使用的内存 的情况。内 存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对 该段内存的控制,因而造成了内存的浪费
内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现 内存泄漏会导致 响应越来越慢,最终卡死。

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

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

相关文章

【Linux】进程初步理解

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 冯诺依曼体系结构1.1 认识冯诺依曼体系结构1.2 存储金字塔 2. 操作系统2.1 概念2.2 结构2.3 操作系统的管理 3. 进程3.1 进程描述3.2 Linux下的PCB 4. task_struct本身内部属性4.1 启动4.2 进程的创建方式4.2.1 父…

2024.4.5-[作业记录]-day10-CSS 布局模型(层模型)

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 作业 2024.4.5-学习笔记1 CSS定位1.1 相对定位 relative1.2 绝对定位 absolut…

MATLAB实现数值求解高阶常微分方程组

一、高阶常微分方程组 高阶常微分方程是指包含多个高阶常微分方程的系统。这些方程通常涉及多个未知函数及其高阶导数。解决高阶常微分方程组通常比解决单个高阶常微分方程更为复杂,因为需要同时考虑多个方程和多个未知函数之间的关系。 一般来说,解决…

分类预测 | Matlab实现TCN-BiGRU-Mutilhead-Attention时间卷积双向门控循环单元多头注意力机制多特征分类预测/故障识别

分类预测 | Matlab实现TCN-BiGRU-Mutilhead-Attention时间卷积双向门控循环单元多头注意力机制多特征分类预测/故障识别 目录 分类预测 | Matlab实现TCN-BiGRU-Mutilhead-Attention时间卷积双向门控循环单元多头注意力机制多特征分类预测/故障识别分类效果基本介绍模型描述程序…

电商-广告投放效果分析(KMeans聚类、数据分析-pyhton数据分析

电商-广告投放效果分析(KMeans聚类、数据分析) 文章目录 电商-广告投放效果分析(KMeans聚类、数据分析)项目介绍数据数据维度概况数据13个维度介绍 导入库,加载数据数据审查相关性分析数据处理建立模型聚类结果特征分析…

网站SSL证书是什么?有什么用处?

SSL证书是一种数字证书,主要用于保障互联网通信过程中的信息安全,特别是涉及敏感信息(如个人身份、金融交易数据、登录凭据等)的在线传输。以下是对SSL证书从原理、作用等方面进行的简单介绍: 原理: 1. 公…

WordPress建站教程:10步快速搭建个人网站

WordPress是一个广泛使用的内容管理系统(CMS),凭借其用户友好的界面和大量可定制的主题和插件,为WordPress 提供了多功能性和灵活性,可用于创建各种类型的网站,包括个人博客、B2B企业网站、B2C外贸网站等&a…

python小练习(ps:可评论区讨论)

1. (单选题)海龟初始坐标为(0,0),让海龟往坐标原点后方移动200像素的语句是 A. turtle.penup(200)B. turtle.fd(200)C. turtle.goto(200)D. turtle.bk(200) 2. (单选题)改变海龟画笔尺寸的是 A. turtle.penwidth()B. turtle.pen…

接口和抽象类的综合案例

题目要求: 代码框架: 代码实现: person类: package www.jsu.com;public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name name;this.age age;}public …

C++ | Leetcode C++题解之第12题整数转罗马数字

题目: 题解: const string thousands[] {"", "M", "MM", "MMM"}; const string hundreds[] {"", "C", "CC", "CCC", "CD", "D", "DC&qu…

嵌入式系统初学者指南

什么是嵌入式系统? 嵌入式系统是一种独立的、基于微处理器的计算机系统。您可以将其视为大型系统的一部分的微型计算机。如今,从洗碗机到波音 747,几乎所有“电子”产品内部都有嵌入式系统。但是,嵌入式系统与笔记本电脑或手机不…

Minikube本地搭建单节点Kubernetes集群

1、什么是 Minikube Minikube 是一个开源工具,旨在为开发者提供一种便捷的方式在本地环境中搭建单节点的 Kubernetes 集群。它主要用于开发、测试和学习 Kubernetes 应用程序,无需依赖大型的硬件资源或复杂的多节点集群配置。minikube 使用轻量级虚拟化技…