对于应用程序而言,内存中存储区域大致有堆、栈、静态区域三个部分。系统在分配内存的时候,会在内存中寻找一个能够满足申请大小的区域进行标记,并返回此区域的大小。
在应用程序运行时,系统为应用程序分配的只是虚拟的地址空间,并不是实际的物理存储器。这就需要给进程预定的区域(地址空间)调拨物理存储器(内存),来存放相关的数据。但是通过CPU来进行操作,也可以将磁盘早上的页交换文件作为内存的一部分。通过页交换文件使得内存增加,但是同时将消耗大量CPU资源。
如果多个进程共享一个内存映射文件,在修改文件内容时,系统会产生一个新视图,来复制当前文件中的内容,也就是说,修改的其实是复制视图的内容,修改完毕后,系统将新视图的内容更新到源文件中,此时所有共享此内存的进程全部会看到修改的内容。
堆:对于应用程序而言,是一块由系统为应用程序而分配的内存区域。一个进程默认的有一个默认堆区域,程序中所有的内存申请,全部来自此区域。如:new/malloc申请的内存。在进程结束后,默认堆空间释放。应用程序对堆的访问原则上是顺序的,如3个线程同时访问堆,必须进行排队。程序猿也可以不使用进程默认的堆,进行自己创建一个堆。将 new操作符重载即可使用自己创建的堆空间。但是delete操作符也必须重载。
栈:一个进程中,默认的也会有一个栈区域,但是栈是由系统编译器进行分配和销毁。栈的存在是因为进程中的主线程,在线程中(程序中)声明的局部变量全部都在栈上。进程中的每一个线程都对应有一个线程栈,进行存储线程中的局部变量。由系统进行回收。
静态区域:程序中所有的静态或者全局变量都存储在此区域,在进程结束后,由系统进行回收。
顺便提一下new和malloc.个人觉得要说两者区别无非两点:
1、 new是操作符,在申请内存的时候,编译器会调用构造函数自动对申请的区域进行初始化。Malloc是个函数,只会申请内存不会进行初始化。
2、 new申请的时候,必须指定类型,成功后会返回指定类型的指针。指针指向分配的内存地址。Malloc 申请的时候,如果不强制指定类型,返回一个void *的指针。也就是说申请的内存区域可以存放任何类型的数据。
两者都是在堆上进行申请。New申请的对象在释放后,应该讲此对象的指针指向NULL,而不是不处理。
memory
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
libxml2剖析(2):编译
我还在迷路
2018-08-27 20:04:11
libxml2 主要函数用法
我还在迷路
2018-08-27 20:04:11
windows 编译libxml2 64位及32位都可以使用
我还在迷路
2018-08-27 20:04:11
socket编程 及select poll epoll示例
我还在迷路
2018-08-27 20:04:09
libxml2剖析(3):使用教程
我还在迷路
2018-08-27 20:04:09
const的思考
duchuanying
2018-08-27 19:55:25
深入理解C语言指针的奥秘
duchuanying
2018-08-27 19:55:25
C/C++ 程序设计员应聘常见面试试题深入剖析
duchuanying
2018-08-27 19:55:24
内核模式下获取SSDT服务索引代码
毛主席夸帅
2018-08-27 19:54:14
获取Windows系统版本号以及位数(兼容Win8)
毛主席夸帅
2018-08-27 19:54:13
[Win32]获取当前系统可用磁盘空间最大的盘符
毛主席夸帅
2018-08-27 19:54:02
在物理内存不足的情况下使用内存映射文件进行大内存操作
毛主席夸帅
2018-08-27 19:54:01
DirectDraw方式截取系统屏幕
毛主席夸帅
2018-08-27 19:53:51
GDI方式截取系统屏幕
毛主席夸帅
2018-08-27 19:53:50