new和malloc的使用,C语言中的malloc和C中new的区别

1,C语言中的malloc和C中new的区别new是5261C++的运算符 malloc是C的函数 。所以从效率4102上来说 new的效率更高 。另外 , 1653 在对象操作上,new会调用构造函数,而malloc只是单纯分配内存 。内所以 在C++对象申容请中,必须用new而不是mallocmalloc是只分配空间,返回void类型的地址 。用new的话,包含malloc的功能,而且会调用类的构造函数 。。。【new和malloc的使用,C语言中的malloc和C中new的区别】
2,malloc函数怎么使用需要包含头文件:#i nclude 或#i nclude 函数声明(函数原型):void *malloc(int size);说明:malloc 向系统申请分配指定size个字节的内存空间 。返回类型是 void* 类型 。void* 表示未确定类型的指针 。C,C++规定,void* 类型可以强制转换为任何其它类型的指针 。从函数声明上可以看出 。malloc 和 new 至少有两个不同: new 返回指定类型的指针 , 并且可以自动计算所需要大小 。比如:int *p;p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);或:int* parr;parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针 。int* p;p = (int *) malloc (sizeof(int));第一、malloc 函数返回的是 void * 类型,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量” 。所以必须通过 (int *) 来将强制转换 。第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小 。如果你写成:int* p = (int *) malloc (1);代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数 , 就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空 。malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小 。比如想分配100个int类型的空间:int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间 。另外有一点不能直接看出的区别是 , malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的 。除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致 。
3,malloc是什么意思怎么使用呢malloc是动态分配内存,和free对应使用,参见文档http://baike.baidu.com/link?url=C_3kMeshvKXFWwayMbbOCbf8QiOrXaZ83hi-tBBtlBjgu8FYrZWqGVQfA5Oikfz3czU85tMPkchHl86XikQJEa需要包含头文件: #i nclude 或 #i nclude 函数声明(函数原型): void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间 。返回类型是 void* 类型 。void* 表示未确定类型的指针 。c,c++规定,void* 类型可以强制转换为任何其它类型的指针 。从函数声明上可以看出 。malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小 。比如: int *p; p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int); 或: int* parr; parr = new int [100]; //返回类型为 int* 类型(整数型指针) , 分配大小为 sizeof(int) * 100; 而 malloc 则必须由我们计算要字节数 , 并且在返回后强行转换为实际类型的指针 。int* p; p = (int *) malloc (sizeof(int)); 第一、malloc 函数返回的是 void * 类型,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量” 。所以必须通过 (int *) 来将强制转换 。第二、函数的实参为 sizeof(int),用于指明一个整型数据需要的大小 。如果你写成: int* p = (int *) malloc (1); 代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归 , 而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空 。malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小 。比如想分配100个int类型的空间: int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间 。另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中 , 其值将是随机的 。除了分配及最后释放的方法不一样以外 , 通过malloc或new得到指针,在其它操作上保持一致 。
4,malloc函数的与new的区别从本质上来说,malloc(Linux上具体实现可以参考man malloc,glibc通过brk()&mmap()实现)是libc里面实现的一个函数 , 如果在source code中没有直接或者间接include过stdlib.h,那么gcc就会报出error:malloc was not declared in this scope 。如果生成了目标文件(假定动态链接malloc),如果运行平台上没有libc(Linux平台,手动指定LD_LIBRARY_PATH到一个空目录即可),或者libc中没有malloc函数 , 那么会在运行时(Run-time)出错 。new则不然 , 是c++的关键字,它本身不是函数 。new不依赖于头文件,c++编译器就可以把new编译成目标代码(g++4.6.3会向目标中插入_Znwm这个函数,另外,编译器还会根据参数的类型,插入相应的构造函数) 。在使用上,malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小 。比如:int *p;p = new int;//返回类型为int *类型(整数型指针),分配大小为sizeof(int);或:int *parr;parr = new int[100];//返回类型为int *类型(整数型指针) , 分配大小为sizeof(int) * 100;而 malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针 。int *p;p = (int*)malloc(sizeof(int) * 128);//分配128个(可根据实际需要替换该数值)整型存储单元,//并将这128个连续的整型存储单元的首地址存储到指针变量p中double *pd = (double*)malloc(sizeof(double) * 12);//分配12个double型存储单元,//并将首地址存储到指针变量pd中第一、malloc 函数返回的是 void * 类型 。对于C++,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译 , 报错:“不能将 void* 赋值给 int * 类型变量” 。所以必须通过 (int *) 来将强制转换 。而对于C,没有这个要求,但为了使C程序更方便的移植到C++中来,建议养成强制转换的习惯 。第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小 。在Linux中可以有这样:malloc(0),这是因为Linux中malloc有一个下限值16Bytes , 注意malloc(-1)是禁止的;但是在某些系统中是不允许malloc(0)的 。在规范的程序中我们有必要按照这样的格式去使用malloc及free:type *p;if(NULL == (p = (type*)malloc(sizeof(type))))/*请使用if来判断,这是有必要的*/比如想分配100个int类型的空间:int *p = (int*)malloc(sizeof(int) * 100);//分配可以放得下100个整数的内存空间 。另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中 , 其值将是随机的 。除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致 。对其做一个特例补充char *ptr;if((ptr = (char*)malloc(0)) == NULL) puts(Gotanullpointer);else puts(Gotavalidpointer);此时得到的是Got a valid pointer 。把0赋给malloc能得到一个合法的指针 。参考以下程序分析说明 new 和 malloc 的区别:1#include 2#include 3#include 4using namespace std; 5class t 6{ 7 public: 8 t(){ cout << "t()" << endl; } 9 ~t(){ cout << "~t()" << endl; } 10 }; 11int main() 12{ 13 t* first = new t; 14 t* second = (t*)malloc(sizeof(t)); 15 if( first ) delete first; 16 if( second ) free(second); 17 return 0; 18} 解答: 由第13、14行代码可见,new,malloc均能完成动态分配一个新的空间的功能 , 并把它的首地址交给一个指针 。区别在于: 1. new直接写在类型t的前面,是c++中的一个操作符,且直接分配t大小的内存空间 。而malloc是c中的一个函数,且需要借助于函数sizeof帮其判断t类型的大?。?2. new直接返回一个t类型的指针,而且会调用类中的构造函数 。而malloc返回一个void指针 , 需要在前面对其强制定义为一个t类型的指针,不用调用构造函数 。3. new与delete搭配使用,delete会调用类中的析构函数对内存进行释放 。malloc则与free搭配 , 不调用析构函数 。malloc是c语言中国申请动态内存的,而new是c++中的 。而且malloc申请多个内存还要加上东西,new还是比较好用的5,C中new出得对象与C中的malloc出得有什么联系和区别1、new 是c++中的操作符,malloc是c 中的一个函数2、new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数 , 而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数3、内存泄漏对于malloc或者new都可以检查出来的 , 区别在于new可以指明是那个文件的那一行,而malloc没有这些信息 。4、new 和 malloc效率比较new可以认为是malloc加构造函数的执行 。new出来的指针是直接带类型信息的 。而malloc返回的都是void指针 。void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间 。返回类型是 void* 类型 。void* 表示未确定类型的指针 。C,C++规定,void* 类型可以强制转换为任何其它类型的指针 。从函数声明上可以看出 。malloc 和 new 至少有两个不同: new 返回指定类型的指针 , 并且可以自动计算所需要大小 。比如: int *p; p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int); 或: int* parr; parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100; 而 malloc 则必须由我们计算要字节数 , 并且在返回后强行转换为实际类型的指针 。int* p; p = (int *) malloc (sizeof(int)); 第一、malloc 函数返回的是 void * 类型 。对于C++,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量” 。所以必须通过 (int *) 来将强制转换 。而对于C,没有这个要求 , 但为了使C程序更方便的移植到C++中来,建议养成强制转换的习惯 。第二、函数的实参为 sizeof(int)  , 用于指明一个整型数据需要的大小 。如果你写成: int* p = (int *) malloc (1); 代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容被改写 。malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小 。比如想分配100个int类型的空间: int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间 。另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的 。除了分配及最后释放的方法不一样以外,通过malloc或new得到指针 , 在其它操作上保持一致 。对其做一个特例补充 char *ptr; if ((ptr = (char *)malloc(0)) == NULL) puts("Got a null pointer"); else puts("Got a valid pointer"); 此时得到的是Got a valid pointer 。把0赋给malloc能得到一个合法的指针 。简单的来讲堆(heap)上分配的内存,系统不释放,而且是动态分配的 。栈(stack)上分配的内存系统会自动释放,它是静态分配的 。运行时栈叫堆栈 。栈的分配是从内存的高地址向低地址分配的,而堆则相反 。由malloc或new分配的内存都是从heap上分配的内存,从heap上分配的内存必须有程序员自己释放,用free来释放,否则这块内存会一直被占用而得不到释放 , 就出现了“内存泄露(Memory Leak)” 。这样会造成系统的可分配内存的越来越少,导致系统崩溃 。所以说他们本来就是一脉相承的 , malloc出来的要free,这两个都是C中的函数,而new出得要由delete来释放,所以说,他们是一样的作用不一样的姓名和血统 。详细的可以参考《高质量C++编程一书》 。我给你简单说要点:1、new是对malloc的封装,你可以这么认为 。2、为何要用new?因为c++引入了类,类都要初始化,所谓的构造函数是也 。malloc支持的是对堆内存的分配,是按大小来的,比如分100字节 。但malloc没法完成类的初始化,类的对象实例里面有很多数据成员,分配和初始化方式多样,很难按照字节自己分配和初始化,这就需要你自己定义构造函数 。然后new只是负责给你调用,这样分配和初始化对象 。给你摘一段看看:malloc 与 free 是 C++/C 语言的标准库函数,new/delete 是 C++的运算符 。它们都可用于申请动态内存和释放内存 。对于非内部数据类型的对象而言,光用 maloc/free 无法满足动态对象的要求 。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数 。由于malloc/free 是库函数而不是运算符 , 不在编译器控制权限之内 , 不能够把执行构造函数和析构函数的任务强加于 malloc/free 。因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符 new , 以及一个能完成清理与释放内存工作的运算符 delete 。注意 new/delete 不是库函数 。详细看《高质量C++编程一书》,我就不给你复制了 。很小的200多k,参考资料里面是下载地址 。祝好运!1、new 是c++中的操作符,malloc是c 中的一个函数2、new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数3、内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行 , 而malloc没有这些信息 。4、new 和 malloc效率比较new 有三个字母, malloc有六个字母new可以认为是malloc加构造函数的执行 。new出来的指针是直接带类型信息的 。而malloc返回的都是void指针 。一:new delete 是运算符,malloc,free是函数malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符 。它们都可用于申请动态内存和释放内存 。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求 。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数 。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free 。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete 。注意new/delete不是库函数 。我们先看一看malloc/free和new/delete如何实现对象的动态内存管理,见示例 。class Objpublic :Obj(void)~Obj(void)voidInitialize(void)voidDestroy(void)};void UseMallocFree(void)Obj*a = (obj *)malloc(sizeof(obj));// 申请动态内存a->Initialize();// 初始化//…a->Destroy();// 清除工作free(a);// 释放内存}void UseNewDelete(void)Obj*a = new Obj;// 申请动态内存并且初始化//…delete a;// 清除并且释放内存}示例用malloc/free和new/delete如何实现对象的动态内存管理类Obj的函数Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能 。函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作 。函数UseNewDelete则简单得多 。所以我们不要企图用malloc/free来完成动态对象的内存管理 , 应该用new/delete 。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的 。既然new/delete的功能完全覆盖了malloc/free , 为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存 。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错 。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差 。所以new/delete必须配对使用,malloc/free也一样 。二:new delete在实现上其实调用了malloc,free函数 。三:new operator除了分配内存,还要调用构造函数 。malloc函数只是负责分配内存

    推荐阅读