首页 > 其他分享 >new和malloc的区别,分别解释它们的用法

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

时间:2024-11-06 19:48:11浏览次数:5  
标签:malloc int void 用法 内存 new delete

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释放已分配的对应内存。自由存储区不等于堆,

 

标签:malloc,int,void,用法,内存,new,delete
From: https://blog.csdn.net/2302_80908313/article/details/143577773

相关文章

  • C# WebSocketSharp 框架的用法
    一、概述WebSocketSharp是一个C#实现websocket协议客户端和服务端,WebSocketSharp支持RFC6455;WebSocket客户端和服务器;消息压缩扩展;安全连接;HTTP身份验证;查询字符串,起始标题和Cookie;通过HTTP代理服务器连接;.NETFramework3.5或更高版本(包括兼容环境,如Mono)。github地址ht......
  • 【Xshell】高级用法: “隧道转发”
    原创大龙山悟道IT运维不跑路xshell隧道转发类型类型一:本地拨出Local(Outgoing)作用:将本地计算机指定的某个端口连接到远程服务器的一个指定端口上。应用场景:当从本地机器安全地访问位于远程服务器上的服务(如数据库、web服务等)时使用。工作原理:通过SSH连接,用户在本地机......
  • new与malloc
    一、newnew是操作符,利用new在堆区开辟数据,开辟的数据需要手动开辟,在使用结束后用delete手动释放,利用new创建的数据,会返回该数据对应的类型指针用法1:在堆区申请一块空间存放一个数#include<iostream>usingnamespacestd;int*fun(){//new在堆区申请内存,返回的是申请......
  • odoo中对多条数据按条件进行分类汇总 read_group的用法总结并抽取出公式
    今天在工作中遇到一个这样的问题。要求:做一个打印模板实现下面图中的分类汇总 py3o://for="oinobject.delivery_containers_line.read_group(domain=[('delivery_order_id','=',object.id)],fields=['customer_id','delivery_order_id','sales_order_......
  • JavaScript用法
    JavaScript 用法HTML中的Javascript脚本代码必须位于 <script> 与 </script> 标签之间。Javascript脚本代码可被放置在HTML页面的 <body> 和 <head> 部分中。<script>标签如需在HTML页面中插入JavaScript,请使用<script>标签。<script>和</script>......
  • 2024newstarweb题解
    w1headach3会赢吗源码flag碎片X1:ZmxhZ3tXQTB3再次查看源码flag碎片X2:IV95NF9yM2Fs第三个页面也是直接查看源码直接改源码flag碎片X3:MXlfR3I0c1B下一个页面直接禁用jsflag碎片X4:fSkpKcyF9ZmxhZ3tXQTB3IV95NF9yM2FsMXlfR3I0c1BfSkpKcyF9base64解码即......
  • websocket用法
    WebSocket是一种在客户端和服务器之间建立持久化连接的协议,允许双向通信。它适用于实时应用程序,如聊天应用、在线游戏或实时数据流。以下是WebSocket在Vue.js中的基本用法:1.建立WebSocket连接首先,创建WebSocket连接:constsocket=newWebSocket('ws://your-server-u......
  • 队列的用法详解
    队列是一种常用的数据结构,具有先进先出(FIFO,First-In-First-Out)的特点。通常用来管理需要按顺序处理的任务,例如打印队列、任务调度、资源分配等。下面详细介绍队列的基本概念、常用操作、类型及其在C语言中的实现。队列的基本概念在队列中:入队(enqueue):将元素添加到队列的......
  • NewStar CTF 2024 misc WP
    decompress压缩包套娃,一直解到最后一层,将文件提取出来提示给出了一个正则,按照正则爆破密码,一共五位,第四位是数字 ^([a-z]){3}\d[a-z]$一共就五位数,直接ARCHPR爆破,得到密码xtr4m,解压得到flagpleasingMusic题目描述中提到:一首歌可以好听到正反都好听根据提示(其实也能听出来后半段......
  • arkUI:文本框、文本域的创建和常见用法(TextInput 、TextArea)
    arkUI:文本框、文本域的创建和常见用法(TextInput、TextArea)1主要内容说明2例子2.1文本框、文本域的创建(TextInput、TextArea)2.1.1源码1(文本框、文本域的创建)2.1.2源码1运行效果2.2设置文本框的输入类型2.2.1源码2(设置输入框的输入类型)2.2.2源码2运行效果2.3......