【c++】七夕快到了却还没对象?手把手教你new一个出来!

news/2025/1/15 6:40:44/

前言

本章给大家带来的是C++内存管理。在C语言阶段,我们经常使用malloc,calloc,realloc,free进行内存管理。但是,C语言的内存管理存在很多缺陷,会对程序的稳定性和安全性造成影响。

不过,C语言的内存管理同时也给程序员提供了更大的自由度和灵活性,可以更加精细地控制程序的内存使用。而C++有他自己的一套内存管理,就是:new和delete。

C/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在哪里?____ staticGlobalVar在哪里?____
staticVar在哪里?____ localVar在哪里?____
num1 在哪里?____
char2在哪里?____ *char2在哪里?___
pChar3在哪里?____ *pChar3在哪里?____
ptr1在哪里?____ *ptr1在哪里?____
2. 填空题:
sizeof(num1) = ____;
sizeof(char2) = ____; strlen(char2) = ____;
sizeof(pChar3) = ____; strlen(pChar3) = ____;
sizeof(ptr1) = ____;

为了防止误看到答案,我将答案放到文章末尾,需要的自取哦

 各个区域的作用

  • 栈——向下生长,生长方向是向下的,也就是向着内存地址减小的方向生长,存储非静态局部变量,函数参数,返回值等
  • 堆——用于程序运行时动态内存分配,堆是可以上增长的,,也就是向着内存地址增大的方向增长
  • 内存映射段——高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口
  • 创建共享共享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下)
  • 数据段——存储全局数据和静态数据
  • 代码段——存储可执行代码和常量

c语言内存管理方式

主要分为malloc,calloc,realloc三种方式

但是无一例外都很麻烦,不但类型要自己确定,大小也要自己确定,使用完还要手动free

而且面对自定义类型,还要自己初始化,实在是很麻烦

针对这种情况,c++提出了new和delete来方便我们的使用

C++内存管理方式

通过new和delete操作符进行动态内存管理

new和delete使用起来其实很简单,下面几行代码就代表了几乎所有的情况

void Test()
{
// 动态申请一个int类型的空间
int* ptr4 = new int;
// 动态申请一个int类型的空间并初始化为10
int* ptr5 = new int(10);
// 动态申请10个int类型的空间
int* ptr6 = new int[3];
delete ptr4;
delete ptr5;
delete[] ptr6;
}

注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用
new[]和delete[],一定注意要匹配起来使用,如果不匹配使用在不同编译器下有不同的结果

new和malloc,delete和free的区别

new和delete是操作符,而malloc和free则是函数

new开辟空间后会自动调用构造函数,delete销毁空间后则会自动调用析构函数,这是c++提出new和delete的主要原因

new扩容失败后会抛异常,不用我们手动判断

new和delete的实现原理

new=operator new函数申请空间+调用构造函数,完成对象的初始化工作

delete=operator delete函数释放对象的空间+执行析构函数,完成对象中资源的清理工作

operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。

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

本质上还是使用了malloc和free函数,不过c++将其封装起来了,方便我们的使用,此处我们就可以体会到封装的力量的强大之处

答案

cccaa

aaadab

40,5,4,4or8,4,4or8

总结

本章主要讲解的是C++内存管理的知识,具体有:new/deleteoperator new/operator delete

后续将会继续输出有关C++的文章,你们的支持就是我写作的最大动力!

感谢阅读本小白的博客,错误的地方请严厉指出噢~


 


 


http://www.ppmy.cn/news/1029355.html

相关文章

8位数码管动态扫描显示(数码管闪烁)

/*----------------------------------------------- 内容&#xff1a;8位数码管分别显示不同数字&#xff0c;这种扫描显示方式成为动态扫描 ------------------------------------------------*/ #include<reg52.h> //包含头文件&#xff0c;一般情况不需要改动&#x…

使用python快速搭建HTTP服务实现局域网网页浏览或文件传输

1.使用命令行&#xff08;CMD&#xff09;来快速搭建一个HTTP服务器 你可以借助Python的http.server模块。以下是在命令行中使用Python快速搭建HTTP服务器的步骤&#xff1a; 打开命令提示符&#xff08;CMD&#xff09;。 进入你想要共享文件的目录。使用 cd 命令来切换到目…

枚举缓存工具

此文章为笔记&#xff0c;为阅读其他文章的感受、补充、记录、练习、汇总&#xff0c;非原创&#xff0c;感谢每个知识分享者。 文章目录 1. 背景2. 枚举缓存3. 样例展示4. 性能对比5. 总结 本文通过几种样例展示如何高效优雅的使用java枚举消除冗余代码。 1. 背景 枚举在系统…

C++11异步与通信之 packaged_task

概念简介 packaged_task 用于包装可调用目标(Callable)为一个对象,如lambda&#xff0c;普通函数&#xff0c;小括号重载等&#xff0c;用于异步调用。 其返回值或所抛异常被存储于能通过 std::future 对象访问的共享状态中&#xff0c;和promise类似。 将函数的调用与函数返…

c++病毒/恶搞代码大全( 上 )

注&#xff1a;以下代码应勿用于非法&#xff08;Dev-c5.11实测可用&#xff09; 1: 效果:无限生成cmd 解决方法&#xff1a;关闭程序即可 #include<bits/stdc.h> #include<windows.h> using namespace std; int main() {while(1)system("start cmd"…

SpringBoot复习:(36)国际化

一、Resources目录下建立一个目录&#xff08;比如international)来存储资源文件 message.properties 空的&#xff0c;但不能没有 message_zh_CN.properties hello您好message_en_us.properties hellohello world二、自动配置类MessageSourceAutoConfiguration 常量MESSAGE…

MybatisPlus多数据源

适用于多种场景&#xff1a;纯粹多库、 读写分离、 一主多从、 混合模式等 目前我们就来模拟一个纯粹多库的一个场景&#xff0c;其他场景类似 以下的案例是使用多个数据库 准备工作在不同的数据库中创建不同的表分别为t_user 和product 启动类记得加MapperScan注解 第一步&a…

Spring的事件处理机制

文章目录 1.前言2.事件机制三要素2.1 定义事件2.2 监听事件1.实现 ApplicationListener 接口2.使用 EventListener 注解3.TransactionalEventListener注解 2.3 发布事件 3.异步事件4.实战 1.前言 最近看公司代码&#xff0c;发现针对消息队列的消费和分发做了很多很精妙的设计…