您的代码不是C. 实际上,该语言现在更强大. 也许它在内存回收方面已经完善. 我不懂C ++. 我知道Java语言. 他优化了内存回收. 内存没有被操作系统恢复,但是当Java语言最终被编译成可运行的代码时,该内存就被恢复了(JAVA的垃圾回收机制非常强大,但是我不太喜欢它). 您可以尝试使用C编写,使用malloc进行应用,这不应被回收c语言内存分配对应,可以尝试,当然,这可能与其他原因有关.
最后,如果您想学习内存管理,说明的方向是: 操作系统理论中的分页内存管理,地址打印. 这两个部分是理论上的(相对简单,实际情况比这要复杂一些c语言内存分配对应,最好先看一下理论)
当您真正理解(应该不难理解)时,以下操作将很困难. 选择一个更流行的CPU地址映射(各种不同的CPU地址映射是不同的),我正在查看Intel 80386稍后出现的保护模式(实际上是在286之后,但286并不为人所知),以及Linux中的内存管理(记住要读这本书,很难直接理解代码).
========================================
您的问题有点困难和深刻.
关于内存开发的问题,Linux中有一个非常特殊的内存段. 它的大小是8K. 我们称他为系统堆栈空间. 任何程序代码在运行时都是一个进程. 它将具有这样的过程. 8K的系统堆栈空间. 局部变量放置在这样的8K空间中,包括int a,int a [100],int * a. 他们都放在这里.
然后回答第一个问题,将int a放置在系统堆栈空间中. 该进程终止后,将有其他进程回收该空间(它将指定自身,通常是其父进程),因此您无需手动释放局部变量的内存.
关于int * a;那么您将创建一个有点不同的空间. 首先,* a仍然是局部变量,它存在于系统堆栈中. 但是,特殊存储是逻辑地址,而不是值(实际上,逻辑地址只是一个无符号的16位整数). 当您是新手时,将在堆空间中打开一个空间,并将该空间的地址放在a中. 显然,新应用的空间不在系统堆栈空间中,并且父进程(通常)不会回收该内存,这就是为什么您必须释放(a)自己来释放空间的原因.
我们经常说局部变量不能太大,例如int [10000],这是不允许的. 可以看出,仅使用了8K的内存,而不是全部都用于局部变量. 他有相当一部分. 该内存用于过程控制块和中断以返回现场(在阅读Linux源代码之后您将知道它). 另外,C语言不会检查数组边界. 如果您将[4]数组设置为int,则将其放置在此数组上,而不管一切. 事情可能会让您幸运地洗掉被打断的寄信人地址,聪明的人会放一个新的寄信人地址,而这个地址会返回一个恶意进程. 知道会发生什么,这是缓冲区溢出攻击.
尽管窗口不同,但原理相似.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-193374-1.html