C/C++内存管理(2)

本文介绍了虚拟内存的概念及其重要性,解释了交换分区的作用,并探讨了栈和堆的使用及潜在问题,如栈溢出和内存泄漏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 什么是虚拟内存?
因为目前程序都运行在支持多道程序的系统上,让每个程序都直接使用物理地址是相当危
险和不稳定的。很容易引发访存冲突,甚至造成系统崩溃。所以在现代计算机系统中,程
序都使用虚拟内存来取代直接使用物理内存。虚拟内存对于每个进程来说是自己独占的,
通常为4G, 进程可以独立支配这4G虚拟内存。而不用理会当前系统有多少物理内存,别的进程又是如果使用这些物理内存的。虚拟内存到物理内存的映射,以及不同进程访问物理内存的冲突,这些问题都交由操作系统和硬件去完成了。这样就大大简化了开发程序的难度,每个程序只要处理好自己的4G内存就行了。
 
3, 什么是交换分区,及其作用?
每个进程有自己的4G虚拟内存,通常物理内存都远远小于这些虚拟内存的和。为了节省使用物理内存,操作系统常常使用了延迟加载技术,只有当虚拟内存确实被访问的时候,才分配相应的物理内存供程序使用。另外,操作系统还会把某些暂时用不到的物理内存换出到磁盘上,然后把挪出的物理内存交给最需要的进程。当要重新使用那些被换出的数据的时候,再把它们从磁盘上换入。当然每次换入换出都是以页为单位的。用来保存换出内存数据的磁盘空间,就是交换分区。 Linux上叫Swap分区,Windows上叫虚拟内存(注意与上文提到的程序虚拟内存空间的区别)
 
 
    0xFFFFFFFF
    0xBFFFFFFF
        .
        .        用户空间(3G)
        BSS
        代码段
     
6.栈的大小和栈溢出
栈的大小在不同平台上设定不同,但都有一个上限,当栈的使用超过这个上限的时候,就
会触发tack overflow或者segmentation fault一类的错误。理论上堆和栈都可以占据整个虚存的3G用户空间,但栈的大小必须设置成一个适中的值,如果小了,很容易在分配栈空间的时候(主要是调用某个函数的时候),触发栈溢出。如果栈上限设置得过大,因为属于一个进程的线程共享同一个虚存空间。所以如果每个线程使用的栈过大,则进程能创建的线程就越少。
 
8.什么是内存泄漏?
在堆的使用过程中,一个很重要的问题就是"内存泄漏"。也就是malloc出来的内存,在不使用之后,用户未能及时调用free释放。因为虚存没有释放,相应的物理内存也没有释放,内存泄漏的堆积最终将耗尽系统所有的内存。为了克服内存泄漏问题,Small Pointer, Garbage Collection等技术被大量的研究和使用。但最有效的办法还是在编写程序的时候时刻留意这个问题,小心处理每一次malloc操作。要注意的是,"内存泄漏"只是运行时问题,当进程结束的时候,操作系统就会收回所有分配给该进程的物理内存。
 
10.堆、栈对应的物理内存
不论堆和栈在使用管理上有什么不同,但他们都位于虚存空间,使用的是虚拟内存。只有
当真正使用这些分配的虚拟内存的时候,系统才会分配相应的物理内存供其使用。当堆、
栈被释放回收的时候,虚拟内存被标记为未分配,而相应的物理内存会被系统回收。
也就是当我们执行malloc的时候,整个过程应该是这样的:调用malloc()动态分配内存 --> malloc维护的内存堆中查找有无可用的大小合适的虚拟内存块 --> 如果没有,则用brk()mmap()等函数向系统申请新的虚存空间。并返回合适大小的内存块给用户。--> 当真正使用的时候分配的虚存块的时候,系统将其映射到合适的物理内存。 
            </div>
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在C#开发中,Windows Media Player控件是集成音频和视频播放功能的强大工具。本文将介绍如何在C#中实现不同的播放模式,如随机播放、列表循环和单曲循环,这些功能在多媒体应用中十分常见 。 要使用Windows Media Player控件,首先需要将其添加到C#项目中。在Visual Studio中,可以通过在工具箱中搜索“Windows Media Player”,并将其拖放到窗体上完成 。接着,设置控件的基本属性,如URL,以指定要播放的媒体文件 。 随机播放模式会在一首歌曲播放结束后,随机选择播放列表中的下一首歌曲。可以通过创建一个包含所有歌曲URL的数组,并利用Random类生成随机索引来实现。例如: 列表循环模式会在一首歌曲播放结束后,自动从播放列表的开头重新开始播放。实现方法是检测到播放结束后,将URL重置为列表的第一个元素: 单曲循环模式则是在一首歌曲播放结束后,重新播放当前歌曲。可以通过将播放器的当前播放位置重置为0并重新播放来实现: 以上代码均需在windowsMediaPlayer1_PlayStateChange事件处理器中实现,该事件会在播放器的播放状态改变时触发 。需要注意的是,这些示例假设已正确引用了WMPLib命名空间,并且Windows Media Player控件的ID为“windowsMediaPlayer” 。 在实际应用中,除了实现播放模式外,还可能需要考虑错误处理、用户界面更新等因素。为了使播放列表更具动态性,可以考虑从数据库或XML文件加载歌曲信息,而不是硬编码在代码中,从而提升用户体验 。通过这些方法,可以在C#中灵活实现Windows Media Player的各种播放模式,满足不同多媒体应用场景的需求 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值