• c/c++4个内存分区介绍


    一开始想自己写,写了一个版本,发现还是别人总结的好,还是直接抄吧。。。嘿嘿嘿
    原帖连接:c/c++内存四区介绍

    c/c++内存四个区:代码区,全局区,栈区,堆区
    内存分不同区的意义不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程

    代码区和全局区都是在程序运行前存在的,栈区和堆区是在程序运行后存在的

    1、代码区:存放函数体的二进制代码,由操作系统进行管理

    这个区域的主要特点是共享和只读
    共享,目的是对于拼房被执行的程序,只需要在内存中有一份代码即可
    只读,目的是防止程序意外的修改了他的指令

    2、全局区:存放全局变量和静态变量以及常量

    全局变量、静态变量、字符串常量、const 修饰的全局变量存在于此。
    该区域的数据在程序结束后由操作系统释放

    const 修饰常量包括 const 修饰的局部变量和 const 修饰的全局变量
    不在全局存放的有: 局部变量,const 修饰的局部变量

    3、栈区:由编译器自动分配释放,存放函数的参数值,局部变量等

    由编译器自动分配和释放,存放函数的参数值,局部变量等
    不要返回局部变量的地址,栈区的数据由编译器管理开辟和释放

    示例1

    #include 
    using namespace std;
    int * func()
    {
        int a = 10;
        return &a;
    }
    int mian()
    {
     	int * p =func();
        cout<<*p<<endl;// 第一次正确是编译器进行了保留
        cout<<*p<<endl;// 第二次就不再保留了
        system("pause");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    4、堆区:由程序员分配和释放,若程序员不释放,程序结束后由操作系统回收

    在c++中主要是利用new 在堆区上开辟内存;
    在c中主要是利用malloc 和 delete 在堆区上开辟内存
    堆区的数据由程序员管理开辟和释放

    示例1 new+普通类型,只申请相应内存空间

    #include 
    using namespace std;
    
    int * func1()
    {
    	int * p =new int; 		//new+type,申请一个type大小的内存块   
    							//指针p在声明时,直接用new得到的地址进行了初始化;如果没有后面的new 初始化,需要先指向nullptr空指针,如示例2
        return p;
    }
     
    int * func2()
    {
    	int * p =new int (10); //new+type+(num),申请num个type大小的内存块
        return p;
    }
    
    int main()
    {	
    	int *p1= func1();    //func1()返回一个指针,该指针本质是个地址,指向函数中在堆上申请的数据;现在将该地址给向p1
    	int *p2= func2();
    	
    	if(p1){					//释放前,先判断指针是否有效
    		delete p1;			//new+type的,直接delete 
    		p1=nullptr;			//重新指向空指针
    	}
    	if(p2){
    		delete p2;			//new+type+(num)的,delete []
    		p2=nullptr;
    	}	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    示例2 new+类,申请相应内存空间、同时实例化一个类的对象

    #include 
    using namespace std;
    
    my_class_name *p_object=nullptr;  //声明指针时,如果该指针没有指向它需要指向的地址,那么需要先将其初始化为空指针
    
    void func()
    {
    	p_object=new my_class_name; 		//new+className,申请一个该类需要大小的内存块,并实例化出一个对象
    	//...
    }
     
    int main()
    {	
    	func();
    	//...
    	
    	if(p_object){					//先判断指针是否有效
    		delete p_object;			//释放内存
    		p_object=nullptr;			//p_object重新指向空指针
    	}
    	
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 相关阅读:
    终端天线—9.4G手机调试
    用 SQL 查询每个用户最大连续登录日期
    CDA Level1——1.数据分析的基本概念
    葡聚糖-巯基,extran-SH,Thiol-葡聚糖|巯基化葡聚糖,香菇多糖/辣根过氧化氢酶/溶菌酶
    计算机网络和因特网
    day2:算法之美|打开算法之门与算法复杂性
    JSON flag table for Link not found for toolset v143 v143
    sass和 scss的区别?
    Express-01
    大二下个人发展小结
  • 原文地址:https://blog.csdn.net/m0_37635769/article/details/127876255