C/Cpp动态内存管理

一、C的动态内存开辟

  1. malloc函数:void* malloc(size_t size);向内存申请一块连续可用的内存空间,并返回这块空间的指针;
  2. calloc函数:void* calloc(size_t num,size_t size);开辟num个大小为size的空间,并且空间会被初始化为0;
  3. realloc函数:void*realloc(void* ptr,size_t size);如果要调整的区域ptr没有足够的空间扩容时,就会返回一个新的指针。

二、Cpp的动态内存开辟

2.1 内置类型

如上图,new一个int类型指针p1和一个int类型数组指针p2,并且将数组大小设置为5,通过对指针p1以及数组指针p2解引用进行赋值。

对于p3直接将其初始化为88;

在使用delete对开辟的变量进行资源释放,注意类型的匹配:数组释放delete[] p2。


2.2 自定义类型

如上图,对于自定义类型来说,如果使用new来创建该类型对象,此时就会自动调用该类对象的构造函数,当使用delete删除该类对象时,会自动调用该类对象的析构函数。


2.3 operator new与operator delete

那么new与operator new的区别是什么?

如上图,在进行断点调式后打开反汇编代码可以发现new操作其实是先调用operator new开辟空间,再调用构造函数进行初始化。


如上图,operator new与operator delete的结果其实并无区别,但区别在于operator new开辟空间是被会抛出异常,并且支持重载。


2.4定位new表达式

定位new表达式是在已分配的原始内存空间中调用构造函数初始化对象;

  1. new (place_address) type;
  2. new (place_address) type(initializer-list);
  3. place_address是一个指针,initializer-list是初始化列表;

如上图,A的数组大小为10,如何修改大小为20呢???

如上图,通过定位new来使数组大小更改为20。

三、总结

malloc\free与new\delete区别:

  • 前者是函数,后者是操作符;
  • 前者申请空间不会初始化,后者会初始化(调用了构造函数);
  • 前者申请空间要传大小,后者不需要且[]可指定对象个数;
  • 前者返回值类型为void*,需要强转,后者不需要;
  • 前者开辟空间是被返回NULL,后者抛出异常并需要捕获;
  • 对于自定义类型,前者只能开辟空间,后者可以开辟空间并初始化且会自动完成资源清理(调用了析构函数)。

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

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

相关文章

【感悟《剑指offer》典型编程题的极练之路】02字符串篇!

​ 个人主页:秋风起,再归来~ 文章所属专栏:《剑指offer》典型编程题的极练之路 ​​​​​​ 个人格言:悟已往之不谏,知来者犹可追 克心守己&#xff0c…

python入门题:输入输出练习

以下是Python基础语法的练习,项目要求和代码如下: """ 例3:小精灵:你好,欢迎古灵阁,请问您需要帮助吗?需要or不需要? 你:需要 小精灵:请问你需…

[ZKP] Freivalds’ Algorithm

Freivalds’ Algorithm Freivalds, Rusins. “Probabilistic Machines Can Use Less Running Time.” IFIP congress. Vol. 839. 1977. Problem Statement Suppose we are given as input two n n n \times n nn matrices A A A and B B B over F p \mathbb{F}_p Fp​, w…

代码随想录刷题笔记 Day 59 | 两个字符串的删除操作 No.583 | 编辑距离 No.72

文章目录 Day 5901. 两个字符串的删除操作&#xff08;No. 583&#xff09;<1> 题目<2> 题解<3> 代码 02. 编辑距离&#xff08;No. 72&#xff09;<1> 题目<2> 题解<3> 代码 Day 59 01. 两个字符串的删除操作&#xff08;No. 583&#x…

MFC(二)集成基础控件

目录 OnCreateCStatic【标签&#xff0c;图片】CEdit【文本框&#xff0c;密码框&#xff0c;数值框&#xff0c;文本区】CButton【按钮&#xff0c;单选按钮&#xff0c;多选按钮】CComboBox【下拉列表&#xff0c;列表】CSliderCtrl【滑动条】CListCtrl【表格】CAnimateCtrl【…

【Java程序设计】【C00383】基于(JavaWeb)Springboot的水产养殖系统(有论文)

【C00383】基于&#xff08;JavaWeb&#xff09;Springboot的水产养殖系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c…

Sentinel源码解析

核心源码都在客户端,服务端只是个Dashboard!!! 在服务端配置好规则后,服务端会把规则推到客户端里去【存在客户端内存里】 服务端记录客户端对外提供的一些接口 客户端引用了依赖并启动后,会定时把自己的信息注册到Sentinel服务端去,并且定时发信息保持心跳 主线 注解…

编程出现bug?怎么用Python打印异常

在 Python 编程中&#xff0c;异常是指程序执行过程中出现的错误或异常情况。当程序遇到异常时&#xff0c;为了更好地调试和定位问题&#xff0c;我们需要打印异常信息。本文将详细介绍如何在 Python 中打印异常&#xff0c;并提供一些示例和注意事项。 一、try-except 语句捕…

【数学】 【分数】 【字符串】972. 相等的有理数

本文涉及知识点 数学 分数 字符串 LeetCode972. 相等的有理数 给定两个字符串 s 和 t &#xff0c;每个字符串代表一个非负有理数&#xff0c;只有当它们表示相同的数字时才返回 true 。字符串中可以使用括号来表示有理数的重复部分。 有理数 最多可以用三个部分来表示&…

【保姆级教程】使用SeaTunnel同步Kafka的数据到ClickHouse

1.Apache SeaTunnel依赖地址 2.SeaTunnel官网的Source/Sink模板 3.SeaTunnel的GitHub地址 在官网下载安装包之后&#xff0c;&#xff08;注意&#xff1a;别下载apache-seatunnel-incubating-2.1.0-bin.tar.gz版本&#xff0c;依赖和功能都没有。)要使用apache-seatunnel-2.3…

什么是V R美术馆|V R互动体验店加盟|虚拟现实元宇宙

VR美术馆是利用虚拟现实&#xff08;VR&#xff09;技术构建的数字化美术馆&#xff0c;通过虚拟展厅和虚拟展览等形式展示艺术作品、举办艺术展览&#xff0c;为用户提供一种沉浸式的艺术体验。用户可以通过穿戴VR头显等设备&#xff0c;在虚拟环境中自由浏览各种艺术作品&…

SpringCloud学习笔记二:服务间调用

微服务中&#xff0c;很多服务系统都在独立的进程中运行&#xff0c;通过各个服务系统之间的协作来实现一个大项目的所有业务功能。服务系统间 使用多种跨进程的方式进行通信协作&#xff0c;而RESTful风格的网络请求是最为常见的交互方式之一。 spring cloud提供的方式&#…