new和malloc的区别,分别解释它们的用法

new

 new是 C++ 的一个运算符,用于动态分配对象在堆内存中的空间。它不仅负责内存分配,还会调用对象的构造函数。

分配基本的数据类型

int* pInt = new int;  // 分配一个 int 类型的内存  
*pInt = 10;           // 使用分配的内存

分配数组

int* pArray = new int[5];   // 分配一个整数数组,包含 5 个元素

分配对象

class MyClass {  
public:  MyClass() { /* 构造代码 */ }  
};  MyClass* pObj = new MyClass(); // 动态分配 MyClass 对象

释放内存

使用delete释放new申请的内存,如果new申请的是数组格式的内存,用delete[]释放

delete pInt;         // 释放单个对象  
delete[] pArray;    // 释放数组  
delete pObj;        // 释放对象

重载

new是运算符可以重载,特别的,布局new的就不需要为对象分配内存,而是指定了一个地址作为内存起始区域,new在这段内存上为对象调用构造函数完成初始化工作,并返回此地址

//这些版本可能抛出异常
void * operator new(size_t);
void * operator new[](size_t);
void * operator delete (void * )noexcept;
void * operator delete[](void *0)noexcept;
//这些版本承诺不抛出异常
void * operator new(size_t ,nothrow_t&) noexcept;
void * operator new[](size_t, nothrow_t& );
void * operator delete (void *,nothrow_t& )noexcept;
void * operator delete[](void *0,nothrow_t& )noexcept;

malloc

malloc是 C 标准库中的一个函数,用于动态分配内存块。它只负责分配内存空间,不会调用构造函数。

分配内存

int* pInt = (int*)malloc(sizeof(int));  // 分配一个 int 的内存,注意需要提供大小  
*pInt = 10;                             // 使用分配的内存

分配数组

int* pArray = (int*)malloc(5 * sizeof(int)); // 分配一个包含 5 个 int 的数组

释放内存

free(pInt);       // 释放内存  
free(pArray);    // 释放数组的内存

重载

malloc不可以重载

总结

  1. 函数体 :delete(new)会先执行析构函数 再执行free(malloc)
  2. 返回值: new返回值不需要强转,malloc返回值需要强转
  3. 参数:new不需要传入具体的字节个数 malloc需要传具体字节个数
  4. new会先执行malloc 再执行构造函数给成员变量赋值,malloc只分配堆区内存
  5. 申请失败: new申请失败会抛出异常,malloc会反空
  6. 名字:new是运算符,malloc是函数
  7. delete:先调用析构函数(释放堆区内存),在调用free(释放栈区内存)
  8. new操作符从自由存储区上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。自由存储区不等于堆,

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

讲讲分布式事务?

大家好,我是锋哥。今天分享关于【讲讲分布式事务?】面试题。希望对大家有帮助; 讲讲分布式事务? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在现代的分布式系统中,数据往往分布在不同的服务器、数据中…

【职场日常】软件测试平台如何搭建?

作为一名软件测试工程师,搭建测试环境是我们日常工作的一部分。搭建一个适合各类测试的测试环境至关重要,可以在后期的测试过程中为我们提供便利。接下来我将向大家介绍如何搭建测试环境,以及需要注意的事项。 首先,我们需要确保…

Spring Boot关闭时,如何确保内存里面的mq消息被消费完?

1.背景 之前写一篇文章Spring Boot集成disruptor快速入门demo,有网友留言如下图: 针对网友的留言,那么我们如何解决这个问题呢 Spring-Boot应用停机时,如何保证其内存消息都处理完成? 2.解决方法 方法其实挺简单的&…

3D一览通更新三大功能更新,进一步提升协同效率

大腾智能3D一览通新功能正式发布!本次新版本在通用功能的基础上,新增并优化了3大功能点,为用户带来更加流畅、高效的使用体验,提升设计协同效率。 功能点1:在结构树中管理测量标注对象 在新版本中,我们将…

基于DCT的数字水印算法

摘要 数字水印技术近年来得到了较大的发展,基于变换域的水印技术是目前研究的热点。数字水印是利用数字作品中普遍存在的冗余数据和随机性,把标识版权的水印信息嵌入到数字作品中,从而可以起到保护数字作品的版权或其完整性的一种技术。 一个…

JAVA——反射

目录 1.概述 2.Class类 a.实例化对象 1.利用Class类的静态方法 2. 利用类名 3.利用类的成员方法 b.常见方法 1.获取所有公共构造方法对象的数组 2.获取所有构造方法对象数组 3.获取单个公共构造方法对象 4.获取单个构造方法对象 5.获取所有公共成员变量对象的数组 …

CMDB模型管理:构筑高效IT运维的坚实基础

在CMDB中,模型是一个非常重要的概念,在前面的文章中我们提到了模型对于保障CMDB数据准确性的重要性。那么,要如何理解CMDB的模型呢?模型在CMDB中又是什么地位?能起到什么作用呢? 一、模型概述 在CMDB中&…

一个月调研分析标的“英伟达”

放在现在依然成立 一、移动网兴起至今的最佳股票与人工智能时代的目标 9 年移动网兴起至今,若选一只股票长期持有,最佳解是 ARM(涨了 20 倍),因为无论系统层和应用层谁胜出,底层一定是芯片,而…

实现金蝶和简道云仓库数据的高效集成

实现金蝶和简道云仓库数据的高效集成 金蝶-仓库--->简道云-仓库:高效数据集成方案 在企业信息化管理中,数据的高效流转和实时监控是提升业务效率的关键。本文将分享一个实际案例,展示如何通过轻易云数据集成平台,将金蝶云星空…

Redis - Hash 哈希

一、基本认识 ⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数 组、映射。在Redis中,哈希类型是指值本⾝⼜是⼀个键值对结构,形如key"key",value{{ field1, v…

基于python的简单web服务器示例

安装flask flask 简介:是一个用Python编写的Web应用程序框架。 它由 Armin Ronacher 开发,他领导一个名为Pocco的国际Python爱好者团队。 Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。两者都是Pocco项目 新建项目 创建好的效果 pip list 检索 安装…

职场日常:多年的测试工程师如何继续在测试行业中砥砺前行

大家好,今天我们一起聊聊测试工程师在职业、在团队、在家庭中如何更好的做好角色。 作为一个工作了多年测试工作的大牛来说,从今天开始或许未来会因为各个方面的原因可能不在从事软件测试了,但是会继续总结过往的经验,从事这么多…

【图神经网络】 AM-GCN代码实战(4)【pytorch】代码可运行

AM-GCN 网络系列 代码实践部分1. dataprocess.py1.1 模块导入1.2 特征文件生成1.3 KNN构图 2. configparser.py3. layers.py4. models.py5. utils.py6. main.py总结 代码实践部分 本专栏致力于深入探讨图神经网络模型相关的学术论文,并通过具体的编程实验来深化理解…

「Mac畅玩鸿蒙与硬件25」UI互动应用篇2 - 计时器应用实现

本篇将带领你实现一个实用的计时器应用,用户可以启动、暂停或重置计时器。该项目将涉及时间控制、状态管理以及按钮交互,是掌握鸿蒙应用开发的重要步骤。 关键词 UI互动应用时间控制状态管理用户交互 一、功能说明 在这个计时器应用中,用户…

条件logistic回归原理及案例分析

前面介绍的二元、多分类、有序Logistic回归都属于非条件Logistic回归,每个个案均是相互独立关系。在实际研究中,还有另外一种情况,即个案间存在配对关系,比如医学研究中配对设计的病例对照研究,此时违反了个案相互独立…

LeetCode:1.两数之和——Java 暴力解法哈希表

目录 题目如下: ​编辑 方法一:暴力解法 方法二:哈希表解法 题目如下: 1. 两数之和https://leetcode.cn/problems/two-sum/ 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 tar…

微信商家转账到零钱新玩法,却是个不好接受的消息

大家好,我是小悟。 深耕微信生态的小伙伴都知道,微信这个转账的功能,从一开始的“企业付款到零钱”出了有几个版本了吧。不过不管怎么变,基本都是通过openid就可以直接转账给指定用户。 为提高商户服务效率和体验,防…

C语言使用stream完成协议封送

开发过程中&#xff0c;对于自定义协议的打包&#xff0c;可以借助stream完成。 stream.h #pragma once#include <stdio.h> #include <string.h>typedef struct stream {char d[256];size_t size;size_t len;size_t pos; } stream, *pstream;void stem_init(pstr…

Window 安装ack 搜索软件 及使用

1. 先安装 PowerShell 命令行工具 2. 通过该工具安装命令行包管理器工具 Chocolatey 命令&#xff1a; Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol [System.Net.ServicePointManager]::SecurityProtocol -bor …

基于SSM的社区物业管理系统+LW参考示例

1.项目介绍 系统角色&#xff1a;管理员、业主&#xff08;普通用户&#xff09;功能模块&#xff1a;管理员&#xff08;用户管理、二手置换管理、报修管理、缴费管理、公告管理&#xff09;、普通用户&#xff08;登录注册、二手置换、生活缴费、信息采集、报事报修&#xf…