C语言中new与malloc的区别详解

 更新时间:2023年10月30日 11:29:49   作者:大庆指针  
这篇文章主要介绍了C语言中new与malloc的区别详解,new是运算符,可以用于动态分配,如果想要撤销内存使用delete,new运算符使用的一般格式为new类型,用new分配数组空间时不能指定初值,需要的朋友可以参考下

1.new的定义

new是运算符,可以用于动态分配。如果想要撤销内存使用delete。new运算符使用的一般格式为new类型,用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功。一般来说,使用new申请空间时,是从系统的“堆”(heap)中分配空间,申请所得的空间的位置时根据当时的内存的实际使用情况决定的。但是,在某些特殊情况下,可能需要在程序员指定的特定内存创建对象,这就是所谓的“定位放置new”(placement new)操作。例如:

int *p=new int(6);

2.malloc的定义

malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,且分配的大小就是程序要求的大小。(来源百度百科)

void *malloc(int size);

3.new与malloc的区别

3.1属性方面

new是关键字,需要编译器支持;malloc是库函数,需要头文件支持。

3.2参数方面

new申请内存无需指定内存大小,编译器会根据类型信息自行计算。除此之外,new会调用构造函数。

int* p=new int;//分配大小为sizeof(int)的空间
int* p=new int(6);//分配大小为sizeof(int)的空间,并且初始化为6

malloc必须由我们计算需要申请的字节数,需要显式指出所需内存的尺寸,并且返回后强行转换为实际类型的指针。而且malloc只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值是随机的。

int* p=(int)malloc(sizeof(int)100);//分配可以放下100个int的内存空间

3.3处理数组方面

new有处理数组的new[],使用new[]分配的内存必须使用delete[]进行释放。

int* ptr=new int[100];//分配100个int的内存空间

malloc要想动态分配一个数组的内存,需要我们手动定义数组的大小。使用malloc分配内存必须使用free来释放内存。

int* p=(int)malloc(sizeof(int)100);//分配可以放下100个int的内存空间

3.4返回类型

new分配成功返回的是对象类型指针,与对象严格匹配,无类型转换,所以new是符合类型安全性操作符;malloc返回值类型是void*,一般需要接强制类型转换成我们需要的类型。

3.5分配失败方面

new内存分配失败的时候,抛出bad_ alloc异常 ;malloc分配内存失败时返回NULL。

3.6自定义类型方面

new会先调用operator new函数,申请足够的内存,然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存。 malloc是库函数,只能动态地申请和释放内存,无法强制要求其做自定义类型对象构造和析构函数。

3.7重载方面

new可以重载,malloc不可以重载。 opeartor new /operator delete可以被重载。标准库是定义了operator new函数和operator delete函数的8个重载版本,如下图所示:

//这些版本可能抛出异常 
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;

我们可以自定义上面函数版本中的任意一个,前提是自定义版本必须位于全局作用域或者类作用域中。

3.8内存区域方面

new在自由储存区分配内存,malloc在堆上分配内存。 自由存储区(free store)是C++中通过new和delete动态分配和释放对象的抽象概念,通过new来申请的内存区域可称为自由存储区,通过delete归还内存。特别的,new甚至可以不为对象分配内存,定位new的功能可以做到这一点:

new (place_address) type

堆(heap)C语言和操作系统的术语,堆是操作系统所维护的一块特殊内存,它提供了动态分配的功能,当运行程序调用malloc()时就会从中分配,调用free()归还内存。 一般情况下,所有的C++编译器默认使用堆来实现自由存储,运算符new和delete内部默认是使用malloc和free的方式来被实现。

3.9内存泄漏方面

内存泄漏对于new和malloc都能检测出来,new可以明确指出是哪个文件的哪一行,但是malloc不可以明确指出是哪个文件的哪一行。

3.10效率方面

new是关键字,malloc是库函数,new的效率高于malloc。 new和malloc都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。所以说new的效率高于malloc。

4.总结

在这里插入图片描述

到此这篇关于C语言中new与malloc的区别详解的文章就介绍到这了,更多相关C语言new与malloc的区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现通讯录功能的流程与代码

    C语言实现通讯录功能的流程与代码

    通讯录是一个可以记录亲人、好友信息的工具,这篇文章主要为大家详细介绍了C语言实现通讯录管理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • QT实战之打开最近文档功能的实现

    QT实战之打开最近文档功能的实现

    这篇文章主要为大家详细介绍了如何利用Qt实现打开最近文档功能,并实现基本的新建、打开、保存、退出、帮助等功能,感兴趣的可以动手尝试一下
    2022-06-06
  • C语言设计实现扫描器的自动机的示例详解

    C语言设计实现扫描器的自动机的示例详解

    这篇文章主要为大家详细介绍了如何利用C语言设计实现扫描器的自动机,可识别的单词包括:关键字、界符、标识符和常整型数,感兴趣的小伙伴可以了解一下
    2022-12-12
  • C++如何用智能指针管理内存资源

    C++如何用智能指针管理内存资源

    这篇文章主要介绍了C++如何用智能指针管理内存资源,帮助大家更好的理解和使用c++开发,感兴趣的朋友可以了解下
    2020-08-08
  • C++标准库介绍及使用string类的详细过程

    C++标准库介绍及使用string类的详细过程

    C++中将string封装为单独的类,string 类是 C++ 标准库中的一个非常重要的类,用于表示和操作字符串,这篇文章主要介绍了C++标准库介绍及使用string类,需要的朋友可以参考下
    2024-08-08
  • C语言kmp算法简单示例和实现原理探究

    C语言kmp算法简单示例和实现原理探究

    这篇文章主要介绍了C语言kmp算法简单示例和实现原理探究,本文用简洁的语言说明KMP算法的原理,并给出了示例,需要的朋友可以参考下
    2014-09-09
  • C++中的类与对象深度解析

    C++中的类与对象深度解析

    这篇文章主要为大家详细介绍了C++中的类与对象,使用数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C++简明图解分析浅拷贝与深拷贝

    C++简明图解分析浅拷贝与深拷贝

    在c++中,深拷贝和浅拷贝也算是一个难点,特别是对于初学者来说,往往在不知道两者区别的情况下而错误的使用了浅拷贝,从而导致了野指针之类的问题,但是又因为缺少理解所以很难定位到问题所在
    2022-06-06
  • Vue自定义指令最佳实践教程分享

    Vue自定义指令最佳实践教程分享

    Vue 3 显著增强了自定义指令的功能,使其封装更加灵活和易用,本文将分为基础和进阶两部分,介绍如何实现常用的自定义指令,并提供最佳的项目组织方式,需要的朋友可以参考下
    2024-12-12
  • C/C++实现高并发http服务器的代码示例

    C/C++实现高并发http服务器的代码示例

    这篇文章简单给大家介绍了C/C++实现高并发http服务器的代码示例,文章通过代码和图文介绍的非常详细,感兴趣的同学可以参考阅读
    2023-07-07

最新评论