vc中常用到的几个内存分配c语言中用什么函数分配内存

1、最简单、直接的方法是使用C++运算符new,例如:对于分辨率为x*y*8bit的图像,申请分配内存方法:BYTE *pBuf=new BYTE[x*y];用此方法一定要注意,只要pBuf不使用了,就要用delete将其释放掉。2、较复杂的方法是使用API函数GlobalAlloc和LocalAlloc,此方法分配的内存是以“堆”形式提供的,可使用GlobalLock/LocalLock对所申请的内存加锁,释放则使用GlobalFree/LocalFree。详细操作方法可参阅VS6的MSDN。3、最安全可靠的分配超大容量内存的方法是使用“虚拟内存”技术,即API函数VirtualAlloc/VirtualFree。这种方法必须先申请,再提交,然后才能使用内存。而且不但可加锁,还可使内存处于保护状态,因此非常安全可靠。由于采用虚拟技术,故可分配超大容量空间。4、使用内存映射文件,这种方法是将磁盘文件与内存地址空间联系起来,形成映射关系,提高文件的操作速度。可使用API函数GreatFileMapping或MFC的CMemFile类。值得指出一点的是,在WIN32(用户)应用程序中申请分配到得内存与在设备驱动程序中申请的是有差别的,前者属用户层,后者是系统层的,系统层的可以在用户层使用,但反过来则不一定可以,不过使用new或GlobalAlloc分配的内存可以通用。此外,如果申请分配的内存要在设备驱动的中断处理程序中使用,不能使用VirtualAlloc,否则会被“虚拟”到硬盘上去,造成系统致命错误。
Win7 64位下让VC++6.0编写的Win32程序单进程运行内存突破2G
Win7 64位下让VC++6.0编写的Win32程序单进程运行内存突破2G
最近在调试一个大型的MFC程序的时候,需要在Cview类中申请一个double(float)array[2100][40...
最近读《程序员的自我修养——链接、装载和库》(俞甲子等著)一书时,看到书中一个很有意思的例子:堆的最大申请数量(原书P168,6.4.3),原来从来没有考虑过这个问题,在此处记录学习一下。...
有new当然要delete
new[]就要delete[]
这两句话至死不敢忘。不过最近在delete的时候出现一个问题。
起因是因为多态!
class CFather
1.malloc()、realloc()、free()函数
这三个函数为c++标准库中的函数,都在#include &stdlib.h&中。(1)void *mallo...
C#堆内存分配和栈内存分配
五大内存分区
在C#中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈,就是那些由编译器在需要的时候分配,...
游戏服务端之内存池
内存池(Memory Pool)
1、操作系统的内存分配方式
1.1、连续分配方式
顾名思义,这种分配方式,会将进程分配在连续的空间。
连续分配方式一般可以分为固定分配方式、动态分配方式和伙...
C/C++中,内存中数据存储分成4个区:堆、栈、全局/静态存储区和常量存储区。
栈(stack),就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆(heap),一般由程序员分配释放,若程序员不释放,程序...
共享Windows下C++库之内存池篇
内存池简介
介绍分析内存池改进及所使用技术
如何配合STL容器
Win32汇编——内存管理
一、内存管理基础
1.Windows的内存分层管理图:
2.不同内存管理函数的操作对象图:
3.GlobalMemoryStatus函数通过MEMORYSTATUS结构获取系统内...
没有更多推荐了,VC6.0中对一个普通的控制台程序分配多少内存空间_百度知道
VC6.0中对一个普通的控制台程序分配多少内存空间
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
BlueWanderer
BlueWanderer
采纳数:2186
获赞数:4918
分配内存空间是操作系统干的。鉴于VC6只能生成32位可执行文件,那么地址空间可以2GB,3GB,4GB,分别对应32位Windows,开了3GB模式的32位Windows,64位Windows。
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。malloc函数中2是什么意思?vc6.0中是分配了8个字节吗?_百度知道
malloc函数中2是什么意思?vc6.0中是分配了8个字节吗?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
坟头草三丈八月
来自知道合伙人认证行家
坟头草三丈八月
电脑类行家
采纳数:173
获赞数:1786
毕业龙岩技师学院,专业维修电脑3年现开店
C语言中malloc是动态内存分配函数。函数原型:void *malloc(unsigned int num_bytes);参数:num_bytes 是无符号整型,用于表示分配的字节数。返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者...)功能:分配长度为num_bytes字节的内存块注意:当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。实例:#include&stdio.h&#include&malloc.h&//malloc()函数被包含在malloc.h里面int main(void){char*a=NULL;//声明一个指向a的char*类型的指针a=(char*)malloc(100*sizeof(char));//使用malloc分配内存的首地址,然后赋值给aif(!a)//如果malloc失败,可以得到一些log{perror(&malloc&);return-1;}sprintf(a,&%s&,&HelloWorld\n&);//&HelloWorld\n&写入a指向的地址printf(&%s\n&,a);//输出用户输入的数据free(a);//释放掉使用的内存地址return0;//例2有无内存泄露?}
是8个字节吗
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。执行程序的内存分布总结 - as_ - 博客园
随笔 - 150, 文章 - 0, 评论 - 171, 引用 - 0
以下内容为各方资料汇总 所以逻辑顺序不大清晰
一般认为在c中分为这几个存储区:&&&& 1. 栈--有编译器自动分配释放
&&&&2. 堆--一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
&&& 3. 全局区(静态区)--
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放。
另外还有一个专门放常量的地方。程序结束释放。
&&& 在函数体中定义的变量通常是在栈上,用malloc, calloc,
realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。比如:
int a = 0;
//全局初始化区
//全局未初始化区
void main()
char s[] = "abc";
char *p3 = "123456";
//在常量区,p3在栈上。
static int c = 0;
//全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456");
//放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。
&&&& 还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。 &&& 栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管理的,不用你操心。 &&& 堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。 &&& 在栈上存取数据比通过指针在堆上存取数据快些。 &&& 一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap. 栈是先入后出的,一般是由高地址向低地址生长。
堆和堆栈的区别
一、程序的内存分配
一个由编译的程序占用的内存分为以下几个部分
、栈区()由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
、堆区()一般由程序员分配释放,若程序员不释放,程序结束时可能由回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
、全局区(静态区)()全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放
、文字常量区常量字符串就是放在这里的。程序结束后由系统释放
、程序代码区(text)存放函数体的二进制代码。&
二、堆和栈的理论知识
由系统自动分配。例如,声明在函数中一个局部变量系统自动在栈中为开辟空间
需要程序员自己申请,并指明大小,在中函数如在中用运算符如但是注意、本身是在栈中的。
申请后系统的响应 栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
申请效率的比较: 栈由系统自动分配,速度较快。但程序员是无法控制的。 堆是由分配的内存,一般速度比较慢,而且容易产生内存碎片不过用起来最方便另外,在下,最好的方式是用分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。
堆和栈中的存储内容 栈:在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。 堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
存取效率的比较
是在运行时刻赋值的; 而是在编译时就确定的;但是,在以后的存取中,在栈上的数组比指针所指向的字符串例如堆快。比如: #对应的汇编代码
第一种在读取时直接就把字符串中的元素读到寄存器中,而第二种则要先把指针值读到中,在根据读取字符,显然慢了。
小结: 堆和栈的区别可以用如下的比喻来看出: 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
堆和栈的区别主要分: 操作系统方面的堆和栈,如上面说的那些,不多说了。 还有就是数据结构方面的堆和栈,这些都是不同的概念。这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构。 虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。
申请大小的限制 栈:在下栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在下,栈的大小是(也有的说是,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示。因此,能从栈获得的空间较小。 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
最后以Linux环境用图举例说明:
左边的是UNIX/LINUX系统的执行文件,右边是对应进程逻辑地址空间的划分情况。 &&&&
首先是堆栈区(stack),堆栈是由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。栈的申请是由系统自动分配,如在函数内部申请一个局部变量 int h,同时判别所申请空间是否小于栈的剩余空间,如若小于的话,在堆栈中为其开辟空间,为程序提供内存,否则将报异常提示栈溢出。&&&&& &&&&&&&
其次是堆(heap),堆一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收
。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。堆的申请是由程序员自己来操作的,在C中使用malloc函数,而C++中使用new运算符,但是堆的申请过程比较复杂:当系统收到程序的申请时,会遍历记录空闲内存地址的链表,以求寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,此处应该注意的是有些情况下,新申请的内存块的首地址记录本次分配的内存块大小,这样在delete尤其是delete[]时就能正确的释放内存空间。 &&&&
接着是全局数据区(静态区) (static),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,
未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 另外文字常量区,常量字符串就是放在这里,程序结束后有系统释放。豆丁微信公众号
君,已阅读到文档的结尾了呢~~
vc++动态分配内存VC,内存,分配,VC++,动态分配内,动态内存,内存分配,vc++,vc吧
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
vc++动态分配内存
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 c语言中用什么函数分配内存 的文章

 

随机推荐