每个应用都有自己独立的内存空间,其内存空间一般都有以下几大区域
代码段(代码区):用于存放代码.
数据段(全局区):用于存放全局变量(在C/C++中,定义在函数外面的就是全局变量,全局变量特点是整个程序运行过程中都存在,只要是全局变量它的内存会一直存在,比如植物大战僵尸,不可能把所有的植物和僵尸都变为全局变量,生命周期一直都存在,而且全局变量每个人都可以改,也无法控制权限).
栈空间:每调用一个函数就会给它分配一段连续的栈空间,等函数调用完毕后会自动回收这段栈空间.自动分配和回收.
堆空间:需要主动去申请和释放,什么时候使用堆空间,因为我们有的时候希望,某一个对象它的生命周期能够延长,控制对象在内存中的生命周期(为了灵活控制对象的生跟死,植物活了,马上在堆空间申请空间,植物就会在堆空间活着,但植物一旦被僵尸咬死了,这个植物就会在堆空间移除,就不占用内存空间),在程序运行过程中,为了能够自由控制内存的生命周期,大小,会经常使用堆空间的内存
某个应用的内存空间包括下面4大块
栈空间
堆空间
代码区
全局区
int main(){
// 申请4个字节的堆空间内存
int *p = (int *)malloc(4);// 通过int类型的指针指向存储的地址值,指针存储地址,就可以通过指针来访问存储的内容 call malloc (07FF678CE1316h)
栈空间 堆空间
8个字节(用于存放指针p) 4个字节
// 将10这个值存放到堆空间中去
*p = 10;
free(p)
// 向堆空间申请内存也可以用new
int *p = new int; //call operator new (07FF678CE119Fh)
delete p;
// 数组申请
int *p = (int *)malloc(sizeof(int) *10);
p[0] = 10;
p[1] = 10;
p[2] = 10;
p[3] = 10;
p[4] = 10;
p[5] = 10;
free(p);
或者
int *p = new int[10];
delete[] p;
// 总结:堆空间的申请\释放
malloc \ free
new \ delete
new[] \delete[]
// 注意:
申请堆空间成功后,会返回那一段内存空间的地址
申请和是否必须是1对1的关系,不然可能会存在内存泄漏
int *p1 = new int; // 内存泄漏
p1 = new int;
delete p1;
int size = sizeof(int)
int *p2 = (int *)malloc(size);
memset(p,0,4);
// 从p2开始的4个字节每一个字节都存放0,清空数据,初始化操作
cout << *p << endl;
//memset函数是将较大的数据结构(比如对象,数组等)内存清零的比较快的方法
Person person;
person.m_id = 1;
person.m_age = 20;
person.m_height = 180;
memset(&person,0,sizeof(person));
Person persons[] = {{1,20,180},{2,25,165},{3,27,17}};
memset(persons,0,sizeof(persons))
}
void test1() {
int *p1 = new int; // 这种情况*p1为垃圾数据,没有初始化
int *p2 = new int(); // 初始化为0
int *p3 = new int(5); //4个字节里面存储的5
int *p4 = new int[3]; // 没有初始化的数组
int *p5 = new int[3](); // 数组中全部元素初始化为0
int *p6 = new int[3]{}; // 初始化为0的数组,只要写了大括号,就是初始化为0
int *p7 = new int[3]{5};// 初始化的数组为5,0,0
}
内存空间的布局
最新推荐文章于 2022-10-08 22:29:42 发布