globalalloc、malloc和new的区别
calloc函数和malloc

calloc函数和malloccalloc和malloc都是C语言中分配内存的函数,它们有一些共同点和不同点。
共同点:1. 两个函数都是用来分配内存的,返回一个void *类型的指针,可以用来操作新分配的内存。
2. 分配的内存长度由用户指定,可以是任何整数。
3. 如果分配的内存不被使用了,可以使用free函数将其释放。
1. 分配的方式不同。
malloc函数只分配内存空间,但不初始化分配的内存区域。
而calloc函数分配的内存空间会被初始化为0。
2. 分配的参数不同。
malloc只接受一个参数来指定需要分配的空间大小,而calloc 函数需要两个参数,第一个参数是需要分配的连续内存区域个数,第二个参数是每个内存区域的大小。
3. 分配的效率不同。
calloc相比malloc可能会更慢一些,因为它需要初始化分配的内存区域,而malloc不需要这样做。
下面分别介绍一下这两个函数的用法:1. mallocmalloc用于分配内存,原型如下:void *malloc(size_t size);其中size_t是无符号整型变量,用来表示要分配的内存大小。
使用示例:```int *p = (int *)malloc(sizeof(int));if(p == NULL){printf("分配内存失败。
\n");}else{*p = 123;printf("*p = %d\n", *p);free(p);}```这段代码先分配了一个int类型的变量所需的内存空间,然后将分配的地址赋值给指针p。
如果分配失败,则p将被赋值为NULL;如果分配成功,则可以通过指针p来操作新分配的内存。
最后,使用free函数释放分配的内存。
其中num是需要分配的连续内存区域个数,size是每个内存区域的大小。
总结:calloc和malloc在分配内存时具有不同的作用。
calloc分配的空间会被初始化为0,而malloc分配的空间不做初始化。
new与delete区别

new与malloc1.malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。
它们都可用于申请动态内存和释放内存2.对于非内部数据类型的对象(由enum,union,class、struct等关键字修饰的变量, 基本数据类型如int,char,double等都是内部数据类型,)而言,光用maloc/free无法满足动态对象的要求。
对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。
由malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
3.因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。
注意new/delete不是库函数。
4.C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
5.new可以认为是malloc加构造函数的执行。
new出来的指针是直接带类型信息的。
而malloc 返回的都是void*指针。
new delete在实现上其实调用了malloc,free函数6.new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间;malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针.7.new 建立的是一个对象;malloc分配的是一块内存.相同点:都可用于申请动态内存和释放内存联系;既然new/delete的功能完全覆盖了malloc /free,为什么C++还保留malloc/free 呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。
如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。
明晰C++内存分配的五种方法的区别

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。
里面的变量通常是局部变量、函数参数等。
堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。
如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多,在《const的思考》一文中,我给出了6种方法)明确区分堆与栈在bbs上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他第一个开刀。
首先,我们举一个例子:void f() { int* p=new int[5]; }这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。
在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中,他在VC6下的汇编代码如下:00401028 push 14h0040102A call operator new (00401060)0040102F add esp,400401032 mov dword ptr [ebp-8],eax00401035 mov eax,dword ptr [ebp-8]00401038 mov dword ptr [ebp-4],eax这里,我们为了简单并没有释放内存,那么该怎么去释放呢?是delete p么?澳,错了,应该是delete []p,这是为了告诉编译器:我删除的是一个数组,VC6就会根据相应的Cookie信息去进行释放内存的工作。
用C的malloc和C++的new开辟空间的区别

1. new 不但分配对象空间, 还会在分配后调用对象的构造函数,需要手动使用delete来调用析构函数释放空间,而malloc 只是分配, 不构造:class A{public:A(): m_value(0){}//构造函数public:int m_value;};struct B{Int a;};A *pb1 = new A;Struct B *pb2 = (B *)malloc(sizeof(B));pb1 因为被new 调用了构造函数, 所以pb1->m_value == 0, pb2 的构造函数没有被调用, 所以pb2->m_value 的值不确定(即未初始化).2. new 分配时要指定类型, 是类型安全的; 而malloc 返回的是void *, 类型不安全; 类型不安全的东西在C++ 里是不被提倡的!3.引用只是别名不能作为指针来直接使用,&p=new int;是错误的,但是可以定义如下:int *p=new int;int &rp=p;这样的是rp为指针变量p的别名,*rp就是指针变量p所指向的内容。
4.指针可以指向不同的地址,但是引用不能,它只能指向一个,如:int *p=new int;//引用必须要为对象int a,b;p=&a;p=&b;可以使用。
Int a,b;Int &rt=a;&rt=b;会出现错误。
指针不用初始化,但是引用必须初始化。
int &ra;&ra=a;会报错。
引用的一定是对象,否则会出错如:int *p;int &rp=p;会出错。
5.引用只能在块中使用,不能出块。
如:{int a;int &ra=a;ra=9;}ra=10;//出错,因为出了定义引用的块,他只能在相应的{}中使用。
6.const A *const(cost A *const one)中的各个const的意义如下:(1):表示返回的指针值的对象是不能修改的(2):表示返回的指针是不可以修改的(3):表示指针变量one所指的内容是不可以修改的(4):表示指针变量one是不可以修改的。
malloc和colloc区别

三个函数的声明分别是:void* realloc(void* ptr, unsigned newsize);void* malloc(unsigned size);void* calloc(size_t nelem, size_t elsize);都在stdlib.h函数库内它们的返回值都是请求系统分配的地址,如果请求失败就返回NULLmalloc用于申请一段新的地址,参数size为需要内存空间的长度,如:char* p;p=(char*)malloc(20);calloc与malloc相似,参数elsize 为申请地址的单位元素长度,nelem为元素个数,如:char* p;p=(char*)calloc(20, sizeof(char));这个例子与上一个效果相同realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度< type="text/javascript"> < src="/pagead/show_ads.js" type="text/javascript">< type="text/javascript"> < src="/pagead/show_ads.js" type="text/javascript">如:char* p;p=(char*)malloc(sizeof(char)*20);p=(char*)realloc(p,sizeof(char)*40);注意,这里的空间长度都是以字节为单位。
C语言的标准内存分配函数:malloc,calloc,realloc等。
malloc与calloc的区别为1块与n块的区别:malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。
globalalloc、malloc和new的区别

GlobalAlloc是为了与Win16兼容才保留的,在Win32下不要使用。
全局内存对象使用GlobalAlloc函数分配,在Windows 3.X 的时代,分配的内存可以有两种,全局的和局部的,例如GlobalAlloc和LocalAlloc。
但在Win32的时代这些函数已经被废弃了,现在的内存只有一种就是虚存。
在Win32中所有的进程所使用的内存区域是相互隔离的,每个进程都拥有自己的地址空间。
而且系统使用了页面交换功能,就是利用磁盘空间来模拟RAM,在RAM中数据不使用时将会被交换到磁盘,在需要时将会被重新装入RAM。
两者都是在堆上分配内存区。
malloc()是C运行库中的动态内存分配函数,WINDOWS程序基本不使用了,因为它比WINDOWS内存分配函数少了一些特性,如,整理内存。
GlobalAlloc()是16位WINDOWS程序使用的API,返回一个内存句柄,在实际需要使用时,用GlobalLock()来实际得到内存区。
但,32位WINDOWS系统中,应使用新的内存分配函数HeapAlloc()以得到更好的支持,GlobalAlloc()还可以用,主要是为了兼容。
HeapAlloc apply memory from kernel32.dllGlobalAlloc obsolete malloc apply memory form C runtime memory ,and C r untime applys from kernel32.dll new a wrapper of malloc but it is NOT a must for new to implementbased on malloc.CoMemAlloc apply memory from kernel32.dllall are heap memory.recommend HeapAlloc for big block memory allocationrecommend stack memory space.recommend HeapAlloc for big block memory allocationrecommend stack memory space.malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。
【Z】C面试题413

1、进程和线程的区别进程是系统进行资源分配和调度的单位。
线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。
2、成员变量和成员函数前加static的作用它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。
分别用来反映类的状态。
比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。
3、malloc和new的区别new是C++的关键字。
malloc在分配内存时必须按给出的字节分配,new可以按照对象的大小自动分配,并且能调用构造函数。
可以说new是对象的对象,而malloc不是。
本质上new分配内存时,还会在实际内存块的前后加上附加信息,所以new所使用的内存大小比malloc多。
4、堆和栈的区别栈:由编译器自动分配、释放。
在函数体中定义的变量通常在栈上。
堆:一般由程序员分配释放。
用new、malloc等分配内存函数分配得到的就是在堆上。
栈是机器系统提供的数据结构,而堆则是C/C++函数库提供的。
栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活。
而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。
栈是系统数据结构,对于进程/线程是唯一的。
堆是函数库内部数据结构,不一定唯一。
不同堆分配的内存无法互相制作。
栈空间分静态分配和动态分配两种。
静态分配是编译器完成的,比如自动变量(auto)的分配。
动态分配由alloca函数完成。
栈的动态分配无需释放(是自动的),也就没有释放函数。
为可移植的程序起见,栈的动态分配制作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/释放内存匹配是良好程序的基本要素。
5、不调用C++/C的字符串库函数,请编写函数 strcpy1. C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?2. 讲一讲你理解的web service,在dot net framework中,怎么很好的结合xml?(讲概念就行了)3. C#, Java 和 c++的特点,有什么相同的地方,不同的地方,C#分别从c++和java中吸取了他们那些优点?4. C#可否对内存进行直接的制作?(这可是个难点哦?要注意!)5. 用Visual C++6.0编写的代码(unmanaged code),如何在CLR下和其他dot net component结合?6. 以前作过的一些项目?推荐一下自己的编程经验。
malloc、calloc、new的区别

malloc、calloc、new的区别这⼏个都是动态申请空间⽤到的关键字。
malloc定义:calloc定义:new定义:、FutureNow这个⼈整理的挺好的。
malloc和calloc的区别:calloc在动态分配完内存后,⾃动初始化该内存空间为零,⽽不做初始化,分配到的空间中的数据是随机数据。
其中malloc的简介如下:原型:extern void* malloc(unsigned int size); [1]功能:动态分配内存;注意:size仅仅为申请内存字节⼤⼩,与申请内存块中存储的数据类型⽆关,故编程时建议通过以下⽅式给出,"长度 * sizeof(数据类型)"; [2]calloc的⽤法:void *calloc(size_t nmenb, size_t size);calloc()函数为nmemb个元素的数组分配内存空间,其中,每个元素的长度都是size个字节。
如果要求的空间⽆效,那么此函数返回。
在分配了内存之后,calloc()函数会通过将所有位设置为0的⽅式进⾏初始化。
⽐如,调⽤calloc()函数为n个整数的数组分配存储空间,且保证所有整数初始化为0:pi = calloc(n, sizeof(int));因为calloc()函数会清空分配的内存,⽽malloc()函数不会,所以可以调⽤以“1”作为第⼀个实参的calloc()函数,为任何类型的数据项分配空间。
⽐如:struct point{ int x, y;} *pi;pi = calloc(1, sizeof(struct point));在执⾏此语句后,pi将指向⼀个结构体,且此的成员x和y都会被设为0。
⼀般使⽤后要使⽤ (起始地址的指针) 对内存进⾏释放,不然内存申请过多会影响计算机的性能,以⾄于得重启电脑。
如果使⽤过后不清零,还可以使⽤该指针对该块内存进⾏访问。
头⽂件:或.h [1]以上两个进⾏动态分配的空间,⽤完了之后需要⼈为的进⾏动态的释放。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GlobalAlloc是为了与Win16兼容才保留的,在Win32下不要使用。
全局内存对象使用GlobalAlloc函数分配,在Windows 3.X 的时代,分配的内存可以有两种,全局的和局部的,例如GlobalAlloc和LocalAlloc。
但在Win32的时代这些函数已经被废弃了,现在的内存只有一种就是虚存。
在Win32中所有的进程所使用的内存区域是相互隔离的,每个进程都拥有自己的地址空间。
而且系统使用了页面交换功能,就是利用磁盘空间来模拟RAM,在RAM中数据不使用时将会被交换到磁盘,在需要时将会被重新装入RAM。
两者都是在堆上分配内存区。
malloc()是C运行库中的动态内存分配函数,WINDOWS程序基本不使用了,因为它比WINDOWS内存分配函数少了一些特性,如,整理内存。
GlobalAlloc()是16位WINDOWS程序使用的API,返回一个内存句柄,在实际需要使用时,用GlobalLock()来实际得到内存区。
但,32位WINDOWS系统中,应使用新的内存分配函数HeapAlloc()以得到更好的支持,GlobalAlloc()还可以用,主要是为了兼容。
HeapAlloc apply memory from kernel32.dll
GlobalAlloc obsolete malloc apply memory form C runtime memory ,and C r untime applys from kernel32.dll new a wrapper of malloc but it is NOT a must for new to implement
based on malloc.
CoMemAlloc apply memory from kernel32.dll
all are heap memory.
recommend HeapAlloc for big block memory allocation
recommend stack memory space.
recommend HeapAlloc for big block memory allocation
recommend stack memory space.
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。
它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。
对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。
由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
注意new/delete不是库函数。
我们先看一看malloc/free和new/delete如何实现对象的动态内存管理,见示例7-8。
class Obj{
public :
Obj(){ cout << “Initialization” << endl; }
~Obj(){ cout << “Destroy” << endl; }
void Initialize(){ cout << “Initialization” << endl; }
void Destroy(){ cout << “Destroy” << endl; }
};
void UseMallocFree(){
Obj *a = (obj *)malloc(sizeof(obj)); // 申请动态内存
a->Initialize(); // 初始化//…
a->Destroy(); // 清除工作
free(a); // 释放内存
}
void UseNewDelete(){
Obj *a = new Obj; // 申请动态内存并且初始化//…
delete a; // 清除并且释放内存
}
示例7-8 用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也一样。
全局内存对象使用GlobalAlloc函数分配,在Windows 3.X的时代,分配的内存可以有两种,全局的和局部的,例如GlobalAlloc 和LocalAlloc。
但在Win32的时代这些函数已经被废弃了,现在的内存只有一种就是虚存。
在Win32中所有的进程所使用的内存区域是相互隔离的,每个进程都拥有自己的地址空间。
而且系统使用了页面交换功能,就是利用磁盘空间来模拟RAM,在RAM中数据不使用时将会被交换到磁盘,在需要时将会被重新装入RAM。