自由存储区和堆
以一小段代码为例,提几个问题
#include "iostream"
using namespace std;
void ss(int a)
{
int b=5;
cout<<b+a<<endl;
}
int main()
{
ss(5);
int * p=new int;
delete p;
return 0;
}
1、这个EXE一运行必然要占用一块内存,这块内存是连续的吗?
2、既然调用了函数,一定有一块栈内存吧。栈内存是在这个EXE之内吗?
3,自由存储区和堆是一个概念吗
4、int * p=new int; 这句话开辟的内存地址在EXE的范围内吗?
5、栈是什么时候产生的?是程序一运行的时候?还是调用函数的时候-
--------------------------------------
1. exe运行的时候,系统会创建一个进程,同时会分配一块独立的内存空间给该进程,这个内存空间在32位系统上是从0x00000000到0xFFFFFFFF, 4G的空间大小。
2. CPU时间分配的单位是线程,所有的函数都是在一个线程里面执行的,当线程创建时,系统会分配一段内存和寄存器给这个线程,线程就可以调用函数了。栈内存是在进程内存空间里面。exe是一个文件的概念,只有当exe运行之后,系统创建的exe的进程实例之后,才会分配内存,所有栈内存是在exe的进程实例中的,在exe之内的说法不妥。
3.自由存储区和堆不是一个概念。一般而言,自由存储区是指CRT(C运行时库)通过malloc,free函数管理的内存。堆特指通过new,delete管理的内存。但是在部分编译器的实现上这两块内存都是同一种管理方式。
4. int* p = new int 如上述,在exe的进程空间栈内存空间里面。
5 栈产生的时机如2所讲,是在一个线程创建的时候。
在C++程序中内存是分为5块的,注意区分
1.栈
2.堆
3.自由存储区
4.全局/静态存储区
5.文字常量存储区
从你第三个解释来看,自由存储区应该是C语言中的概念吧? 堆是C++里的概念?
C++ 里面也可以调用malloc和free操作。所以C++里面两种概念都存在的。在C里面可以理解就存在自由存储区这样一个概念。