new/delete 和 malloc/free 的区别

1.malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。但是new能够自动分配空间大小,而malloc需要计算字节数。

2.对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。

因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。---简而言之 new/delete能进行对对象进行构造和析构函数的调用进而对内存进行更加详细的工作,而malloc/free不能。

3.new是类型安全的,而malloc不是,比如:

int* p = new float[2]; // 编译时指出错误

int* p = malloc(2*sizeof(float)); // 编译时无法指出错误

new operator 由两步构成,分别是 operator new 和 construct

4.返回值。malloc分配失败时,返回的是空指针。1993年前,c++一直要求在内存分配失败时operator  new要返回0,现在则是要求operator  new抛出std::bad_alloc异常。很多c++程序是在编译器开始支持新规范前写的。c++标准委员会不想放弃那些已有的遵循返回0规范的代码,所以他们提供了另外形式的operator  new(以及operator  new[])以继续提供返回0功能。这些形式被称为“无抛出”,因为他们没用过一个throw,而是在使用new的入口点采用了nothrow对象:

class widget{   ...   };
widget *pw1 = new widget;//分配失败抛出std::bad_alloc
if(pw1 == 0) ... //这个检查一定失败
widget *pw2 = new (nothrow) widget;//若分配失败返回0
if(pw2 == 0) ... //这个检查可能会成功

联系:

既然new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete,malloc/free必须配对使用。

NULL指针、零指针、野指针:参见此处

参考:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/16/2593754.html

http://blog.csdn.net/u014082714/article/details/45097875

时间: 2024-10-11 17:34:27

new/delete 和 malloc/free 的区别的相关文章

new/delete与malloc/free的区别

参考: https://blog.csdn.net/u013485792/article/details/51329541 https://www.cnblogs.com/lyl-312/p/5528892.html http://www.cnblogs.com/QG-whz/p/5140930.html https://blog.csdn.net/gukesdo/article/details/7506155 本文在写作中参考了上述文章,特此感谢! [导语] 之前对new和delete,mal

new/delete 与 malloc/free的区别

一.概述 在C++中,申请动态内存与释放动态内存用new/delete 与 malloc/free都可以,而且他们的存储方式相同,new/malloc申请的动态内存位于堆中,无法被操作系统自动回收,需要对应的delete也free释放空间. malloc/free是C/C++语言的标准库函数,在C语言中需要头文件#include<stdlib.h>的支持.而new/delete是C++的运算符.对于类对象而言,malloc/free无法满足动态对象的要求,对象要求在创建的同时自动执行构造函数,

new/delete 和malloc/free 的区别一般汇总

一.基本概念 malloc/free: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回一个空指针(NULL). void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由. 2.内存操作: malloc函数的参数是接受需要分配的内存字节数,如果内存能够满足请求量,那么将会返回:指向被分

new delete和malloc free的区别

部分内容摘自:http://www.52rd.com/bbs/Archive_Thread.asp?SID=209143&TID=3&WebShieldDRSessionVerify=QWlrR3KW8IElo27YO6zv 一.他们分别是什么 new和delete是c++中的操作符,malloc和free是c/c++的标准库函数. 在使用完分配的内存时,要及时用delete和free进行内存释放,避免内存泄漏. 二.他们之间的区别 1.malloc的原型为:void * malloc(s

new/delete、malloc/free 的区别

相同点 1.都可以动态的申请或释放内存 2.存储方式相同,动态申请的内存都存放在堆中,无法自动释放,要调用对应的delete和free 区别 1.new能自行的计算需要分配的空间,malloc需要手动计算字节数 int *p1 = new int[10]; int *p2 = (int*)malloc(10*sizeof(int)); 2.new和delete直接带具体类型的指针,malloc和free返回void类型的指针 void *p2 = malloc(10*sizeof(int));

C++中,new/delete和malloc/free的区别

1.new/delete是C++的操作符,而malloc/free是C中的函数. 2.new做两件事,一是分配内存,二是调用类的构造函数:同样,delete会调用类的析构函数和释放内存.而malloc和free只是分配和释放内存. 3.new建立的是一个对象,而malloc分配的是一块内存:new建立的对象可以用成员函数访问,不要直接访问它的地址空间:malloc分配的是一块内存区域,用指针访问,可以在里面移动指针:new出来的指针是带有类型信息的,而malloc返回的是void指针. 4.ne

new 、delete和malloc、free的解析及区别

在c语言中使用函数malloc和free来进行内存管理(分配与释放),在c++中则提供了运算符new和delete来做同样的工作,后者比前者性能更优越,使用更方便更灵活. 1.new用于内存分配的基本形式为: 指针变量名=new 类型 在程序运行过程中new是从堆的一块自由存储区中为程序分配一块与类型字节数相适应的内存空间,并将该块内存的首地址存于指针变量中. eg. int *p;   //声明一个整形指针变量p p=new int;   //动态分配一个存放int型数据的内存空间,并将首地址

new/delete 和 malloc/free有什么区别和联系

区别: 1. new/delete是C++的操作符,malloc/free是C/C++标准库函数. 2. new分为两步的:第一步是申请内存,第二步则是调用构造函数初始化对象.同样,在调用delete的时候,需要先调用析构函数,然后再回收堆内存.malloc只会根据参数分配内存,默认返回指向void*的指针,同样free释放malloc分配的内存. 3.malloc/free是new/delete的一个子集. 共同点: 1. 都必须配对使用,这里的配对使用,可不能理解为一个new/malloc就

关于new,delete,malloc,free的一些总结

首先,new,delete都是c++的关键字并不是函数,通过特定的语法组成表达式,new可以在编译的时候确定其返回值.可以直接使用string *p=new string("asdfgh");来直接赋值.这其中在调用new分配空间得时候的时候,系统其实直接调用了类或结构的构造函数来对对其进行赋值,这个过程就相当于是string p=string("asdfgh"); 或者string p("asdfgh");(其实上面的过程还是有一定的不同之处: