new/delete和malloc/free异同

C++】C语言malloc/freeC++new/delete异同 C++的堆内存管理 1、C++中专门管理堆内存的语句,而C语言中只能使用标准库的函数来管理堆内存new 分配内存,相当于C语言中的malloc delete 释放内存,相当于C语言中的free 2、newdelete的使用方法 类型* p = new 类型; // 分配一块内存 注意:new会自动计算字节数,且返回的是有类型的地址。 delete p; // 释放内存 类型* p = new 类型[n]; // 分配n块连续的内存 delete[] p; // 释放n块连续的内存 注意:new/del 阅读详情

  在C++中当我们不清楚将要使用的内存空间参数(size == n)时,比如在一个函数int Fibonacci(const int n){} 中,如果使用空间换时间的方法,我们将要分配一个整型指针数组int *temp, 但是,这个数组的大小该是多少就是不确定的。在C语言里使用的是int * temp = (int *) malloc (sizeof(int) * n); 而最后需要将所申请的内存释放掉,即:free(temp); 在C++中使用 int * temp = new int[n]; ... delete [] temp; 而这两者的异同是什么呢?我最初也不是很清楚,所以在各大论坛搜了下,发现的确有很多以前经常用的但是不知所以然的地方,这里把他们梳理出来给大家分享。

  (一) 申请和释放:

  i. int * a = new int(10); 与 int * a = new int[10];

  // *a = 10;                        // a 数组头指针,数组大小为10

  ii. int * a = new int[M * N];  与 int **a = new int[M][N];

  均可以用于申请二维数组,第一个是用一维数组表示二维数组,但是用起来有木有很灵活的赶脚儿~

  iii. delete 

  delete a; // 释放 整型指针 a

  delete [] a; // 释放 整型一维数组指针 a

  for (int i = 0; i < M; ++i) {

    delete [] a[i]; // 释放 整型二维数组指针 a

  }


  (二) new / delete and malloc / free 异同:

  1.1. new/delete是C++里才有的,而new/delete与malloc/free一个显著的区别在于,new是建造一个对象,并调用对象的构造函数来初始化对象,其实在所有的new操作过程中,总是分为两步的:第一步是申请内存,第二步则是调用构造函数初始化对象。同样,在调用delete的时候,需要先调用析构函数,然后在销毁堆内存。

  1.2. new/delete通常来说是操作符,就是"+","-"一样。 
  1.3. new/delete是可以重载的,而重载之后,就成为了函数。 
  1.4. malloc在申请内存的时候,必须要提供申请的长度,而返回的指针是void*型,必须要强转才能成为需要的类型。
  1.5. 当new/delete在类中被重载的时候,可以自定义申请过程,比如记录所申请内存的总长度,以及跟踪每个对象的指针。 

  1.6. C++默认的new/delete操作符内部,其实也调用了malloc/free这两个函数。

  2.1. 都必须配对使用,这里的配对使用,可不能理解为一个new/malloc就对应一个delete/free,而是指在作用域内,new/malloc所申请的内存,必须被有效释放,否则将会导致内存泄露,至于内存泄露的检查方法,我们推荐的工具是大家众所周知的BoundsChecker,至于如何使用BoundsChecker,我们将在以后撰文详解。

  2.2. 都是申请内存,释放内存,free和delete可以释放NULL指针。


  需要注意的点:
  new/delete与malloc/free不能混合使用,有些人对这个观点持怀疑态度,因为在很多时候,他混合使用之后也没有严重的后遗症,那是因为在通常情况下,new操作符的确调用了malloc这个函数,所以free函数可以正常的释放new出来的内存空间。但这并不能保证所有的new操作符都是调用C++的new的原始操作符,而最常见的是,在类中,我们是可以重载new这个操作符的,这样的话,如果一但在operator=new()函数中调用了其它的申请函数的话东西,free将无法正常工作,或者说也将导致内存泄露。
Unity WebGL发布避坑指南:从内存设置到字体打包,一次搞定所有常见问题 本文详细解析Unity WebGL发布的完整流程,从内存设置到字体打包,提供全面的避坑指南。涵盖关键检查清单、内存性能优化配置、资源处理专项优化及平台适配技巧,帮助开发者高效解决常见问题,确保项目顺利发布。 阅读详情

相关推荐

6、SAP HANA 建模全解析

本文全面解析了 SAP HANA 建模的核心内容,包括属性视图、分析视图计算视图的创建使用。文章详细介绍了建模工具的安装、不同视图类型的适用场景及操作步骤,并通过对比案例分析帮助读者更好地理解建模流程。此外,还涵盖了建模过程中的注意事项及性能优化建议,为 SAP HANA 用户提供实用的建模指导。

juice的博客 181

malloc/freenew/delete异同

malloc/free是我们在C语言里面学习的开辟空间释放空间的函数。 而new/delete是我们在C++里面学习的开辟空间释放空间的运算符。 malloc/freenew/delete的相同点: 1.他们都是用来开辟出一块空间供我们使用; 2.在使用mallocnew的时候必须要freedelete配对使用,否则会造成内存泄漏。 malloc/freenew/delete的不同点...

bareheadedman的博客 486

Lighttools光学设计+全套中文模拟课程(6套)+文档教程大全(500篇)+安装宝+素材

1.全套《中文视频课程》2.文档教程大全(各类资料汇总)3.模型素材4.安装宝+详细安装教程,有效5.注意:本文本,内含下载链接,如果失效,可以联系,补发

面试题:new/deletemalloc/free的区别联系?

1.malloc/free为C的标准库函数,函数原型为: void* malloc(size_t size)//参数代表字节个数 void free(void* pointer)//参数代表内存地址 newdelete则为C++的操作运算符,它调用的分别为赋值运算符重载operator new()operator delete(); 2.在使用上,malloc/free如下: 用malloc分别开辟了1个4个整型大小的空间free释放它们; void func() { //开辟一个空间 i

changyi9995的博客 1465

malloc/free new/delete异同

int *p1 = (int *)malloc(sizeof(int) * length); int *p2 = new int[length]; 这是因为new 内置了sizeof、类型转换类型安全检查功能         1、new自动计算需要分配的空间,而malloc需要手工计算字节数         2、new是类型安全的,而malloc不是,比如:        

洋小葱的博客 340

malloc/freenew/delete异同

malloc/freenew/delete异同点 相同点malloc/freenew/delete都可以用于申请动态内存释放内存,他们申请的空间都在堆上分配。 不同点1)操作对象不同malloc/freeC++/C语言的标准库文件,new/deleteC++的运算符;对非内部数据对象,malloc/free无法满足动态对象要求。对象在创建时要自动执行构造函数,对象消亡之前要自动执行析构函数

没有最好,只有更好! 2501

简述malloc/freenew/delete的区别

malloc/free是C语言提供的库函数,通过函数调用访问,需要传递参数并接收返回值;而new/deleteC++提供的运算符。malloc/free只能用于基本类型,而new/delete不但可以应用于基本类型,还可以应用于面向对象中的自定义类型。malloc函数返回的是void*类型,程序需要显示地转换成所需要的指针类型;new操作符后面直接指明了类型,不涉及类型转换问题。malloc函数...

zrh_CSDN的博客 1036

new/deletemalloc/free异同

而在 C 语言或对异常不敏感的系统代码中,可以使用。,自定义内存池管理,提高分配效率。如果不希望抛异常,可以使用。的标准库函数,用于在。在 C++ 项目中,推荐。

zjkyeah的博客 654

malloc/freenew/delete异同

malloc/freenew/delete异同点 1.同: 都是从堆上申请空间,需要用户自己释放空间。 2.异: (1)mallocfree是函数,newdelete是操作符 (2)malloc申请的空间不会初始化,new可以初始化 //malloc申请的空间不会初始化 int *p = (int*)malloc(sizeof(int)*10); free(p); //new申请的空间可以初始化,指针p1指向一个int类型的存储空间,并初始化其为100 int *p1 = new

YZ2019CSDN的博客 237

new/deletemalloc/free异同

一、new/delete 1、new(新建) 用于新建一个对象。new 运算符总是返回一个指针(由 new 创建)。 2、delete(删除) 释放程序动态申请的内存空间。delete 后面通常是一个指针或者数组 [],并且只能 delete 通过 new 关键字申请的指针,否则会发生段错误。 二、malloc/free 1、malloc malloc 的全称是 memory allocation...

程序员小明 1463

【C/C++ new/deletemalloc/free异同及原理】

new是类型安全的,malloc不是。//编译错误//编译无错误new调用名为operator new的标准库函数分配足够空间并调用相关对象的构构造函数,delete指针所指对象运行适当的析构函数,然后通过调用名为perator delete的标准库函数释放该对象所用内存。后者均没有相关调用。new是封装了malloc,直接free不会报错,但是这只是释放内存,而不会析构对象newdelete是如何实现的?

一起学习进步! 1526

new/delete malloc/free异同

1.相同点 两者的功能都是用于申请/释放内存。 2.不同点 1.new/deleteC++的运算符(可重载),malloc/free是C语言的标准库函数。 2.new分配完内存自动执行构造函数,delete在释放完内存年后会执行析构函数。而mallocfree不行。 3.new返回申请类型的指针,而malloc 返回void* 需要强制转换。 4.new申请失败抛出bad_alloc类型的异常,而malloc申请失败返回 nullptr。 ...

qq_38836825的博客 230

malloc/freenew/delete异同

malloc/freenew/delete异同 一、基本概念 malloc/free: 1、函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存指针。如果分配失败,则返回一个空指针(NULL)。 void free(void *First...

HJ.Zhou 191

百度面试题——malloc/freenew/delete异同

相同点: malloc/freenew/delete都用来进行内存分配释放。 不同点: 1、malloc/freeC++/C语言的标准库函数,而new/deleteC++的运算符。 2、采用malloc申请内存以字节为单位,且返回的内存类型为void *,因此赋予具体的类型时需要进行强制转换;而new则可根据需要的类型进行分配,并返回匹配类型的指针。 3、对于非内部数据类型的

qinghunya的专栏 1072

20141215-Amazon Intern F2F Interview Experence

面试前准备   面试通知是上周四发过来的,主要是说明了下时间地点,没什么特别的。实习要求也没什么特别之处,只是写了下基本要求,像VC、C++这样的硬性要求等。这里主要谈谈对于此次面试之前几次面试类似要求的实习岗位的几点总结吧。   说实话,以前面试经历还是比较少的,只是暑期前随便投递了一个公司,结果面了两面就过了,也没有再投递其他公司,就这样进到公司实习了。总的来说这次面试经历对我有很大的

BayINGbf的专栏 1281

20141204-关于使用C++标准输入输出库:iostream的一点思考

转载请注明出处~   iostream(In and Out stream)是C++语言中标准库(standard library)中提供IO机制的函数库,包含两个基础类型istreamostream,分别表示输入流输出流。一个“流”指的就是一个字符序列,表示从IO设备读出或写入IO的。“流”(stream)即:随着时间的推移,字符是顺序产生或消耗掉的;   标准输入输出库中定义了四种对象

BayINGbf的专栏 1038

20141210-实习面试经历

昨天晚上在应届生求职网看到了北大Google创业团队招聘软件工程师及实习生的信息,仔细查看职位要求后在今天(12.10)上午10点左右通过Email投递了简历。处理效率很快,中午12点左右就收到了那边团队的电话,简单了解了我的基本情况后,定了下午2点的面试,地点在北大的理科楼。   通过这我得到了如下信息:   i. 一般创业团队发招聘信息,肯定是很需要人才的,一般你慎重考虑符合基本条件后,发

BayINGbf的专栏 1010

关于结构体的内存分配问题--sizeof(/*struct*/A)

问题描述:C、C++中的结构体 struct A{变量列表}; 是定义类的一种方式,class 关键字类似,同样可以定义继承方式为public、private、protected三种方式,但是不同的是一点是,struct默认集成方式为public,而class默认继承方式为private。 - 两者的内存分配具体方式都需要考虑 内存对齐 问题。 - 这里先分析struct的内存分配方式基本类型的

BayINGbf的专栏 953

LeetCode Num64_Minimum Path Sum

问题描述:   Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.   Note: You can only move either d

BayINGbf的专栏 850

LeetCode Num74_Search a 2D Matrix

问题描述:   Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Integers in each row are sorted from left to right.The firs

BayINGbf的专栏 806
上一篇: eclipse installation tips for windows
下一篇: 2015.03.15日记--与朋友论道--关于如何面对生活
bayingbf
博客等级 码龄15年 1粉丝 18原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值