【c++】——类和对象(下) ——内存管理
作者:chlorine
专栏:c++专栏
目录
💻 C/C++内存分布
💻C语言中动态内存管理方式:malloc/calloc/realloc/free
编辑
💻C++内存管理方式
👉new/delete操作内置类型
👉new和delete操作自定义类型
💻operator new与operator delete函数(重要点进行讲解)
💻new和delete的实现原理
👉内置类型
👉 自定义类型
💻常见面试题
malloc/free和new/delete的区别
💻 C/C++内存分布
我们先来看一下下面的一段代码吧
int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{static int staticVar = 1;int localVar = 1;int num1[10] = { 1, 2, 3, 4 };char char2[] = "abcd";const char* pChar3 = "abcd";int* ptr1 = (int*)malloc(sizeof(int) * 4);int* ptr2 = (int*)calloc(4, sizeof(int));int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);free(ptr1);free(ptr3);
}
1. 选择题:
选项 : A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)
globalVar在哪里?_C___ staticGlobalVar在哪里?_C___
staticVar在哪里?__C__ localVar在哪里?__A__
num1 在哪里?___A_上面的几个变量的位置在哪大家肯定很清楚,下面几个变量就有些难度了。
选项 : A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)
- char2在哪里?__A__ * char2在哪里?_A__
字符串默认是常量字符串存储常量区,而char2是开辟的数组存储在栈区
将字符串拷贝给数组(数组是初始化)。但是我们要知道数组名是数组首元素的地址。
char2是数组首元素的地址,对数组首元素的地址解引用是'a'不再常量区,而是栈区。因为字符串已经拷贝给数组,数组在栈区那么字符串就在常量区。所以这里是大家出错的地方,我一开始也选的是D,但是我们要知道字符串虽然存储在常量区,但是我们要给新开辟的数组初始化,就得给堆区的字符串拷贝给数组。
选项 : A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)
- pChar3在哪里?_A_ * pChar3在哪里?_D__
- const char* pChar3 = "abcd";
pChar3是指针变量,存储在栈区,这是毋庸置疑的。字符串默认是常量字符串存储在常量区。pchar3是指向常量区"abcd\0"的地址,*pchar3是对常量区的"abcd\o"字符串解引用,找到字符串中a字符的,所以在字符串在哪*pchar就在哪。所以*pChar3存储在常量区。
选项 : A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)
- ptr1在哪里?_A___ * ptr1在哪里?__B__
- int* ptr1 = (int*)malloc(sizeof(int) * 4);
ptr1是指针变量,在栈区,而表达式后面malloc其实是在堆上malloc个空间,*ptr1指向那块开辟的空间并对其解引用,找到那块空间,所以在*ptr1在堆区。
2. 填空题:int num1[10] = { 1, 2, 3, 4 };
char char2[] = "abcd";const char* pChar3 = "abcd";
int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
sizeof(num1) = _40___;
sizeof(char2) = _5___; strlen(char2) = __4__;
sizeof(pChar3) = __4/8__; strlen(pChar3) = _4/8___; 指针4/8字节
sizeof(ptr1) = _4/8___;

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

realloc

free

💻C++内存管理方式
C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因 此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理 。
👉new/delete操作内置类型
voidTest()
{// 动态申请一个int类型的空间int*ptr4=new int;// 动态申请一个int类型的空间并初始化为10 int*ptr5=new int(10);// 动态申请10个int类型的空间int*ptr6=new int[10];delete ptr4;delete ptr5;delete[] ptr6;
} 

如果我们想申请3个int类型的空间,并初始化1,2,3.

注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用 new[]和delete[],注意:匹配起来使用。
👉new和delete操作自定义类型
class A
{
public:A(int a = 0): _a(a){cout << "A():" << this << endl;}~A(){cout << "~A():" << this << endl;}
private:int _a;
};
int main()
{// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间//还会调用构造函数和析构函数A* p1 = (A*)malloc(sizeof(A));A* p2 = new A(1);free(p1);delete p2;return 0;
}


💻operator new与operator delete函数(重要点进行讲解)

- operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间 失败,尝试执行空 间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。
- operator delete: 该函数最终是通过free来释放空间的
💻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来释放空间
💻常见面试题
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需要捕获异常
特性 + 用法(上面5点)
- 6. 申请自定义类型对象时,malloc / free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理
别心急,任何事
相关文章:
【c++】——类和对象(下) ——内存管理
作者:chlorine 专栏:c专栏 目录 💻 C/C内存分布 💻C语言中动态内存管理方式:malloc/calloc/realloc/free 编辑 💻C内存管理方式 👉new/delete操作内置类型 👉new和delete操作自定义类型 …...
大数据平台/大数据技术与原理-实验报告--部署全分布模式Hadoop集群
实验名称 部署全分布模式Hadoop集群 实验性质 (必修、选修) 必修 实验类型(验证、设计、创新、综合) 综合 实验课时 2 实验日期 2023.10.16-2023.10.20 实验仪器设备以及实验软硬件要求 专业实验室(配有cen…...
Android Gradle 升级到7.x及Maven推送问题
7.0以下的Android插件工程使用Maven上传时脚本如下所示。 plugins {id com.android.libraryid kotlin-androidid maven }// 源代码一起打包 task androidSourcesJar(type: Jar) {archiveClassifier.set(sources)from android.sourceSets.main.java.sourceFiles }uploadArchive…...
【实战】K8S Helm部署Redis Cluster Redisinsight
文章目录 前言部署Redis Cluster安装Redis Insight写在最后 前言 在Web服务的开发过程中,Redis一直以来都有着举足轻重的作用。基本上所有的后端服务都会用这个中间件实现具体的业务场景,比如常作为系统缓存、分布式锁,也可以实现排名、定位…...
3.前端--HTML标签-文本图像链接【2023.11.25】
1.HTML常用标签(文本图像链接) 文本标签 标题 <h1> - <h6> 段落<p> 我是一个段落标签 </p> 换行 <br /> <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta ht…...
ctfshow刷题web入门--1--ljcsd
文章目录 ctf.show。信息搜集web1web2web3web4web5web6web7web8web9web10web11web12web13web14web15web16web17web18web19web20。爆破。知识1.1 播种随机数生成器-mt_srand。参考web21--重点web22--做不出来web23web24web25web26web27web28。。。命令执行。知识1 绕过正则表达式…...
乘法原理 LeetCode 828. 统计子串中的唯一字符
我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符,并返回唯一字符的个数。 例如:s "LEETCODE" ,则其中 "L", "T","C","O","D" 都是唯一字符,…...
python桌面开发PyQt6库和工具库QTDesigner安装和配置
一、安装PyQt6 二、安装pyqt6-tools 三、安装外部工具 四、创建QTDesigner 1.首先查找designer.exe的路径(可以自己在窗口中选择,也可以使用Everything搜索) 2.使用Everything搜索后会出现多个designer.exe,选中,OpenPath 3.选择…...
火柴棒等式
枚举 只要在保证等式正确的基础上判断火柴棒有没有用完就可以 因为数比较小,而且我不知道最大的等式中的数是多少,索性就设置为999了 还好对效率要求不大(doge) 要不然就得自己慢慢改最大数来试了 代码如下: #in…...
给定两个字符串 s 和 t ,找不同
题意: 给定两个字符串 s 和 t ,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。 示例 1: 输入:s “abcd”, t “abcde” 输出:“e”…...
从权限跳转看Activity的data android:scheme
在应用申请悬浮窗权限的时候,可以跳转到相应的设置界面,并且自动切换到应用的条目,高亮显示一下, android悬浮窗权限怎么申请 在Android中,要申请悬浮窗权限,需要以下步骤: 在 AndroidManifes…...
C++ Qt QFile用法介绍与代码演示
作者:令狐掌门 技术交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/ 文章目录 打开和关闭文件读取文件写入文件示例代码自定义格式文件解析在Qt 中 QFile 的类用于读写本地文件系统中的文件。它继承自 QIODevice,所以它包含了许多用于数据输入和输出的功…...
Redis面试题:Redis的数据过期策略有哪些?
目录 面试官:Redis的数据过期策略有哪些 ? 惰性删除 定期删除 面试官:Redis的数据过期策略有哪些 ? 候选人: 嗯~,在redis中提供了两种数据过期删除策略 第一种是惰性删除,在设置该key过期时间后,我们…...
1.2.1 C语言结构体初始化方法总结
文章目录 结构体定义通用定义注册事项结构体初始化方法一简述示例方法二简述示例方法三简述示例方法四简述示例方法五简述示例结构体定义 通用定义 常用的结构体定义,有2种形式, 一种是关键字struct 结构体形式,如下...
CentOS 7 安装 Weblogic 14 版本
安装JDK程序 注意:安装weblogic前,先安装JDK!(要求jdk(1.7以上)): 一、创建用户组weblogic及用户weblogic groupadd weblogic useradd -g weblogic weblogic二、将下载好的jdk及weblogic上传至/home/webl…...
ES之x-pack-core-7.14.2许可证修改为白金版
X-Pack是什么 X-pack是elasticsearch的一个扩展包,将安全,警告,监视,图形和报告功能捆绑在一个易于安装的软件包中,虽然x-pack被设计为一个无缝的工作,但是你可以轻松的启用或者关闭一些功能。 主要分一下步…...
在Ubuntu18.04安装适合jdk8的eclipse
直接在Ubuntu软件那里下载的eclipse不能用,下载后启动会报错:Eclipse An error has occurred. See the log file/home/hadoop/.eclipse/ org.eclipse.platform_3.8_155965261/ configuration/1700567835954.log 上网搜索方法,按教程说的修改e…...
openlayers+jsts 实现对行政区以外的区域进行遮罩(兼容多面的情况,兼容不同的ol版本)
先抛效果图,该区域有很多个小面 之前在网上搜到的方式实现 Openlayers 为目标范围以外的区域添加遮罩 - 知乎 核心代码如下,如果您不需要兼容全国的所有省市,而刚好要加地区又是连贯的区域的话,该方法可行,但是如果需要兼容全国…...
【MySQL】查询进阶
👑专栏内容:MySQL⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录 一、数据库约束1、约束类型2、not null3、unique4、default5、primary key6、foreign key 二、新增三、查询1、聚合查询2、分组…...
C++学习之路(五)C++ 实现简单的文件管理系统命令行应用 - 示例代码拆分讲解
简单的文件管理系统示例介绍: 这个文件管理系统示例是一个简单的命令行程序,允许用户进行文件的创建、读取、追加内容和删除操作。这个示例涉及了一些基本的文件操作和用户交互。 功能概述: 创建文件 (createFile()): 用户可以输入文件名和内…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...


