社区
C++ 语言
帖子详情
问一下操作系统和C++内存的分配!
z752964360
2010-03-21 10:12:32
说windows操作系统的书一般会说给进程4gb的地址空间
我想问下是不是在这个进程中所有的堆,堆栈,静态存储区,都在这4gb就是用new,malloc分配的内存都在这里面?(应该是的)
如果都在这里面那进程结束时,内存就都收回来了?
在一个C++的问题,看C#的书说到.NET的内存回收,我想问一下C++只能手动回收内存?
那么,它这么保存这些内存碎片?判断给下一个new分配那里的内存?如果有的话那需要一个多大的数据结构啊!
.NET用堆得话就简单多了!
...全文
334
26
打赏
收藏
问一下操作系统和C++内存的分配!
说windows操作系统的书一般会说给进程4gb的地址空间 我想问下是不是在这个进程中所有的堆,堆栈,静态存储区,都在这4gb就是用new,malloc分配的内存都在这里面?(应该是的) 如果都在这里面那进程结束时,内存就都收回来了? 在一个C++的问题,看C#的书说到.NET的内存回收,我想问一下C++只能手动回收内存? 那么,它这么保存这些内存碎片?判断给下一个new分配那里的内存?如果有的话那需要一个多大的数据结构啊! .NET用堆得话就简单多了!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
26 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
z752964360
2010-04-10
打赏
举报
回复
无奈,结贴了!
k0641302219
2010-03-27
打赏
举报
回复
跟着再顶
z752964360
2010-03-27
打赏
举报
回复
最后顶一次
z752964360
2010-03-26
打赏
举报
回复
如果程序结束,全局数据区和栈上的内存会被操作系统回收,堆上的不会被回收
真的?
z752964360
2010-03-26
打赏
举报
回复
更晕了
hellodudu
2010-03-25
打赏
举报
回复
c++没有gc是因为那样有可能会将整体的效率降低
如果你需要的话可以手写一个
但是gc的实现要考虑到很多情况
dos5gw
2010-03-25
打赏
举报
回复
C++只能手动回收
一个malloc必须对应一个free
一个new必须对应一个del
一个new[]必须对应一个del[]
TW_00001
2010-03-25
打赏
举报
回复
如果程序结束,全局数据区和栈上的内存会被操作系统回收,堆上的不会被回收
z752964360
2010-03-25
打赏
举报
回复
[Quote=引用 10 楼 redleaves 的回复:]
首先,你要了解所以平台硬件的运行方式.Win32运行的X86平台,在一般情况的保护模式下,一个任务可以有4G的地址空间.也就是我们所说的4G内存.这4G空间里包含了代码,数据等等所有进程要用的东西.这也是一般的32位程序地址有32位的原因.
而对于操作系统来说,内存限制一般是直接依赖于硬件的.所以Win32下,一个进程可以有4G的内存地址空间.但对于一个进程来说,并不是所有这4G地址都可用.一……
[/Quote]
X86 MMU的手册 C++的内存回收跟硬件关系很大?
hutrade
2010-03-25
打赏
举报
回复
为什么C++不搞个垃圾回收呢?不就是个链表操作嘛,指针链表C++是强项啊
Redo8228
2010-03-25
打赏
举报
回复
赞一个哈。
[Quote=引用 10 楼 redleaves 的回复:]
首先,你要了解所以平台硬件的运行方式.Win32运行的X86平台,在一般情况的保护模式下,一个任务可以有4G的地址空间.也就是我们所说的4G内存.这4G空间里包含了代码,数据等等所有进程要用的东西.这也是一般的32位程序地址有32位的原因.
而对于操作系统来说,内存限制一般是直接依赖于硬件的.所以Win32下,一个进程可以有4G的内存地址空间.但对于一个进程来说,并不是所有这4G地址都可用.一般……
[/Quote]
HUAXIANGDAGE
2010-03-25
打赏
举报
回复
DING DING
wangxipu
2010-03-25
打赏
举报
回复
虚拟内存,每个进程可以用2G,但是可以调整
ubiquitious
2010-03-25
打赏
举报
回复
[Quote=引用 11 楼 hutrade 的回复:]
为什么C++不搞个垃圾回收呢?不就是个链表操作嘛,指针链表C++是强项啊
[/Quote]
何时回收?如何回收?
如果仅仅是个所谓的link pointer的话,那么C++的自动回收内存早就出来了。
如果能完美的回收内存那么C++ runtime 托管的虚拟机就出来了。
赵4老师
2010-03-25
打赏
举报
回复
[Quote=引用 11 楼 hutrade 的回复:]
为什么C++不搞个垃圾回收呢?不就是个链表操作嘛,指针链表C++是强项啊
[/Quote]
为什么警察不管各家各户是不是锁好了门呢?不就是转一圈嘛。(^_^)
要是你们小区的警察或保安真的负责去锁好那些主人出门没锁或忘记锁的门,估计也是找骂。
redleaves
2010-03-25
打赏
举报
回复
首先,你要了解所以平台硬件的运行方式.Win32运行的X86平台,在一般情况的保护模式下,一个任务可以有4G的地址空间.也就是我们所说的4G内存.这4G空间里包含了代码,数据等等所有进程要用的东西.这也是一般的32位程序地址有32位的原因.
而对于操作系统来说,内存限制一般是直接依赖于硬件的.所以Win32下,一个进程可以有4G的内存地址空间.但对于一个进程来说,并不是所有这4G地址都可用.一般情况下,Windows会占用高2G地址,用来做系统管理,设备地址映射,共享内存等用途.所以,在这种情况下,应用程序只有不到2G的可分配内存.这些内存统一由OS进行分配和释放的管理.粒度比较大.所以只用占用比较少的内存就可以完全描述.在进程结束时,地址空间上所有已经使用的部分,都会由系统统一回收.
应用程序在分配/释放内存时,一般是不会直接使用操作系统的基本分配接口来完成的.C/C++里,通常是由运行时库,在初始化时向系统要一块足够大的内存,在上面建立堆.然后使用堆来进行分配. 其实操作系统在创建进程时,会自动为进程初始化一个堆.但通过操作系统调用,性能上会有比较大的影响.所以一般运行时库会对系统的堆做再包装.
以上是X86上内存管理的基本层次. 在不同的层次上,都有独立的内存管理机制来确保它在设计范围内的功能和性能.而在不同层次上碎片的处理也不同.在OS底层,最小的内存粒度一般是页.所有的分配都是以页为单位.这个层面不会产生一般意义的碎片.只是会将连续的地址分割成不连续的地址段.系统只用维护少量的地址表就可以达成功能(因为粒度大). 在应用程序层面, 内存由堆管理.堆也有它的最小内存分配粒度. 通常会是2^N大小. 由于堆本身就是大块内存,所以一般不用再分配其它的内存来管理堆自身. 堆中每一个可分配块都是一个可用的数据节点,用来保存它自己的信息.所以,在建立堆时,就已经创建好了一个足够大的数据表,完全可以应付内存分配中所有要记录信息.
综上:
>>我想问下是不是在这个进程中所有的堆,堆栈,静态存储区,都在这4gb就是用new,malloc分配的内存都在这里面?
是的.
>>如果都在这里面那进程结束时,内存就都收回来了?
对,在进程结束时,进程的地址空间会被释放.它的页表,及页表项也就相应的要释放.这时,所占用的物理内存就被回收了.
>>在一个C++的问题,看C#的书说到.NET的内存回收,我想问一下C++只能手动回收内存?
C/C++中的动态内存管理是由用户做的.但它只是说你要做分配,和释放的动作.并不用你去管具体的细节.
>>那么,它这么保存这些内存碎片?判断给下一个new分配那里的内存?如果有的话那需要一个多大的数据结构啊!
用户不用直接管理碎片.堆会自动管理,它自动记录可分配内存表,在分配时从表中取适合的一项出来给用户.由于碎片本身就是内存,它就可以在自身的内存里记录自己的信息.不用浪费额外的内存.
另:我上面的的描述只是概要性的.像物理地址,虚拟地址之类的细节没有提及.具体的细节,请参考X86 MMU的手册,OS的手册以及编译器手册.
cattycat
2010-03-25
打赏
举报
回复
4G内存并不是你的程序完全可以用的,事实上你一次malloc4G也不一定给你分配这么多,只有你真正写数据的时候才会被你分配。而且真正的物理内存的部分是内核占用的,一般应用程序不能占用这么多,事实上就被放到了磁盘上的交换区了。
z752964360
2010-03-24
打赏
举报
回复
没人回答啊
z752964360
2010-03-23
打赏
举报
回复
顶下,看看有好的答案没
tj_swjtu
2010-03-22
打赏
举报
回复
学习一下
加载更多回复(6)
C++
第3课:
C++
内存
泄露检测原理及案例实战
C++
第3课:
C++
内存
泄露检测原理及案例实战本课程侧重于
C++
的
内存
管理及泄露检测。我将带领大家学习OS的
内存
管理机制、
C++
的堆和栈、
内存
泄露及检测等。本课程具体的内容主要包括
C++
内存
泄露案例、VS2015
内存
泄露检测、野指针、VirtualAlloc/HeapAlloc/malloc/new的区别、
C++
堆和栈的
内存
管理、栈简介、堆简介、堆与栈区别、栈的
内存
分配
、Windows的虚拟
内存
技术、Windows的
内存
映射文件技术、Linux的虚拟
内存
技术、Linux的Valgrind
内存
泄露检测、Windows的VLD
内存
泄露检测、
C++
内存
泄露检测方式之对象计数、
C++
内存
泄露检测方式之重载new和delete、
C++
内存
泄露检测方式之智能指针等。
C++
内存
分配
的方式
C++
内存
分配
的方式有三种:分别是从静态存储区
分配
,从栈上
分配
内存
和从堆上
分配
内存
。 从静态存储区
分配
内存
从静态存储区域
分配
的
内存
在程序编译的时候就已经
分配
好,这块
内存
在程序的整个运行期间都存在。例如全局变量,static变量。静态
分配
的区域的生命期是整个软件运行期,就是说从软件运行开始到软件终止退出。只有软件终止运行后,这块
内存
才会被系统回收。 从栈上
分配
内存
在执行函数时,函数内局部变量的存...
C/
C++
内存
分配
管理
内存
分配
及管理 1.
内存
分配
方式 在
C++
中
内存
分为5个区,分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 堆:堆是
操作系统
中的术语,是
操作系统
所维护的一块特殊
内存
,用于程序的
内存
动态
分配
,C语言使用malloc从堆上
分配
内存
,使用free释放已
分配
的对应
内存
。 栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈
内存
分配
运算内置于...
C++
内存
分配
方式
栈,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束是这些存储单元自动被释放。栈
内存
分配
运算内置于处理器的指令集中,效率高,
分配
的
内存
容量有限。 堆,就是那些由malloc等
分配
的
内存
块,用free来释放
内存
。 自由存储区,那些由new
分配
的
内存
块,由应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,
操作系统
会自动回收。 全局/静态存储区,全局变量和静态变量被
分配
到同一块
内存
中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C
C++
内存
分配
详解
C++
内存
分配
C++
程序在执行时,将
内存
大致分为4个区域: 代码区:存放函数体的二进制代码,由
操作系统
进行管理 全局区:存放全局变量、静态变量以及常量,生命周期是程序整个运行过程中 栈区:由编译器自动
分配
和释放,存放函数的参数值、局部变量等 堆区:由程序员手动
分配
和释放,若程序员不释放,程序结束时由
操作系统
回收 四区意义: 不同的区域存放不同的数据,赋予不同的生命周期,给程序员更大的操作空间 1 程序运行前 在程序编译后,生成了.exe可执行文件,未执行该程序前分为两个区域 代码区: 存放CPU执
C++ 语言
64,637
社区成员
250,559
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章