当前位置: 首页 > news >正文

浅述C++内存管理——new与malloc的不同

前言

C++相对于其他语言有一个重要的特点就是对于内存的管理,相比于C语言,C++提供了新的关键字new来代替malloc的功能,其中有何不同,请看下文。

一、内存的构成

在我们日常编程过程中最常接触到的就是以下四个分区

在这里插入图片描述

以下将分别给出例子说明每个分区对应存储的内容。

#include <iostream>
using namespace std;int global;
static int stc_global;void func(){int func_val;static int stc_func_val;
}int main(){func();int val;static int val;char arr[] = "abc";char* cptr = "abc";int*ptr = new int;return 0;
}

分析:

**global: **作为全局变量,存放于数据段;

**stc_global: **全局变量,且为静态变量,存放于数据段;

**func_val: **由函数调用产生的临时变量,存放于栈;

**stc_func_val: **临时变量,但是由 static 修饰,因此存放于数据段;

**val: **主函数中创建的临时变量,存放于栈;

**stc_val: **临时变量,但由static修饰,因此存放于数据段;

**arr: **主函数中直接创建的数组,存放于栈;

***arr: **对数组解引用,得到数组第一个元素的首地址,虽然 ”abc“ 是一个常量字符串,但是在此处是将其常量值拷贝到了栈,因此本质还是栈区;

**cptr: **主函数中创建的指针变量,存放于栈区;

***cptr: **与 *arr 不同之处在于,cptr是一个指针变量,直接指向了常量字符串 ”abc" , 而常量字符串作为只读常量,存放于代码段,因此 *cptr 存放于代码段;

**ptr: ** 主函数中创建的指针变量,存放于栈区;

***ptr: **new关键字其功效类似于 C语言中的 malloc 函数,因此 *ptr指向的内容属于堆区;

其中最容易混淆的就是指针变量,许多同学看到 new、malloc 等字就盲目认为存放于堆区,但是关键在于是其中开辟的空间属于堆区,而存放该空间地址的指针变量还是属于栈区

二、C语言和 C++对于内存管理的函数

万物的诞生必有其道理。C语言的内存管理函数为 malloc 和 free,为什么到了 C++就不在适用,反而诞生了 new 和 delete 关键字。其关键在于 C++ 多出的面向对象的概念,下面将从其不同讲述其区别。

2.1 类型不同

在 C语言中,malloc 和 free 作为函数使用,因此在使用时就必须包含对应的头文件;

在 C++ 中,new 和 delete 则作为关键字使用,因此不需要包含头文件即可使用;

2.2 功能不同

前面提到 C++ 之所以诞生出 new 关键字很大一部原因在于面向对象概念的提出。

new 相比于 malloc 最大的提升也在于 new 会调用所创建类型的构造函数,这一点在平时创建 int,char等内置类型时体现的不明显,但是对于一个自写的类,就显得尤为重要。同样的,delete 则会调用类的析构函数,这使得面向对象得以更好的实现。

2.3 失败后返回值不同

这一点在前期不用过多了解,我们只需要知道 C语言在调用 malloc 函数分配空间失败时,会返会一个空的指针,但是在 C++ 中 new 分配空间失败时,则会抛出一个异常,可以用 try—catch 捕获。

http://www.lryc.cn/news/156011.html

相关文章:

  • 语言基础篇11——函数、函数参数类型、装饰器、生成器
  • linux jar包class热部署 工具 arthas安装及使用
  • Android studio 调整jar包顺序
  • 用Qt写的机器视觉绘图工具
  • Spring Boot 打包,将依赖全部打进去
  • SpringCloud入门实战(十五)分布式事务框架Seata简介
  • MySQL数据库 主从复制与读写分离
  • Qt day2
  • JavaScript - 好玩的打字动画
  • rpm打包
  • 匠心新品:大彩科技超薄7寸WIFI线控器发布,热泵、温控器、智能家电首选!
  • 华为云云服务器评测|使用云耀云服务器L实例部署Portainer工具
  • C++并发编程:构建线程安全队列(第一部分:粗粒度锁)
  • C++设计模式-更新中
  • Hydra工具的使用
  • Pytorch学习:卷积神经网络—nn.Conv2d、nn.MaxPool2d、nn.ReLU、nn.Linear和nn.Dropout
  • 水果库存系统(SSM+Thymeleaf版)
  • 如何在VueJS应用程序中设置Toast通知
  • css让元素保持等比例宽高
  • 骨传导和入耳式哪个危害大一点?入耳式和骨传导哪种好?
  • 介绍OpenCV
  • Android中的view绘制流程,简单理解
  • 商城开发:店铺管理系统应具备哪些功能?
  • 小白学go基础04-命名惯例对标识符进行命名
  • 使用iCloud和Shortcuts实现跨设备同步与自动化数据采集
  • Spring框架-基于STOMP使用Websocket
  • kafka-- 安装kafka manager及简单使用
  • 深圳-海岸城购物中心数据分析
  • vue3 + elementplus Cannot read properties of null (reading ‘isCE‘)
  • 易云维®医院后勤管理系统软件利用物联网智能网关帮助实现医院设备实现智能化、信息化管理