我是靠谱客的博主 失眠石头,这篇文章主要介绍C++程序的内存分布C++程序的内存分布,现在分享给大家,希望可以做个参考。

C++程序的内存分布

上节我们介绍了指针引用与常量引用。C++指针引用与常量引用

本节我们介绍C++程序的内存分布!

  • 引入:在一个大的团体中,每个人都有每个人的职位。在C++中同样如此。
    在这里插入图片描述

    1. 栈区(stack): 由编译器管理,存放局部变量和函数参数,很小。超出大小会导致数据溢出。
    2. 堆区(heap): 由程序员分配释放,随叫随到。
    3. 全局/静态区(static): 全局变量和静态变量的存储是放在一起的,在程序编译时分配。
    4. 文字常量区: 存放常量字符串。
    5. 程序代码区: 存放函数体(包含类的成员函数、全局函数) 的二进制代码。
  • 栈区的特点: 函数在结束就会释放里面的变量。也就是生命周期结束。

  • 堆区:由自己申请和释放,即动态内存!

  • 要求用户决定数组的大小,此时需要申请动态内存!
    注意:用完一定要释放,否者就是内存泄漏, 如果不手动进行释放,那么就会在程序结束时由操作系统释放。

    #include <stdio.h>  
    
    using namespace std;
    
    int main(){
       
        //定义一个数组,要求数组大小由用户输入!
        int size;
        printf("输入数组的大小:");
        scanf_s("%d", &size);
    
        if (size <= 0) {
            printf("输入错误!");
            return -1;
        }
    
        //使用下面的方法在某些编译器支持
        //int a[size];
    
        //分配内存空间也就是动态内存给指针
        int* a;
        a = new int[size]; //等同于一个size大小的数组
    
        for (int i = 0; i < size; i++) {
            a[i] = i;
            printf("%d ", a[i]);
        }
    
        //最后需要手动释放申请的动态内存
        delete[] a;
        
        //释放后的内存不能访问!	
        
        return 0;
    }
    

    输出结果:

    输入数组的大小:10
    0 1 2 3 4 5 6 7 8 9
    

    上面new申请的a它的生命周期到delete[] a为止

  • 分配一个变量的动态内存

    #include <stdio.h>  
    
    using namespace std;
    
    int main(){
    	int* a;
        
        //int后面可以带参数也可以不带
        a = new int(600); 
    	printf("%d", *a);
        
        delete a;
        
        return 0;
    }
    

    输出结果:

    600
    

    此处只分配了一个int大小的动态内存。

  • 全局静态区:

    #include <stdio.h>  
    
    using namespace std;
    
    //a就是全局变量
    int a = 100;
    
    void test() {
        //在test中打印全局变量
        printf("a = %dn", a);
    
        //静态变量b只能在该函数中使用
        static int b = 10;
        b += 20;
        //不能在别的函数中调用静态变量b
        printf("b = %dn", b);
    }
    
    int main() {
       //调用两次test();
        test();
        test();
    
        return 0;
    }
    

    输出结果:

    a = 100
    b = 30
    a = 100
    b = 50
    

    在编译时就给全局变量和静态变量分配了内存。

  • 文字常量区:存放字符串常量。

    #include <stdio.h>  
    
    using namespace std;
    
    int main() {
        //字符常量区
        const char* a = "苹果";
        const char* b = "苹果";
    
        printf("a的地址0x%pn", a);
        printf("b的地址0x%p", b);
    
        return 0;
    }
    

    输出结果:

    0x00571D24
    0x00571D24
    

    相同文字常量地址相同!

  • 代码区:存放二进制指令,所有函数最后都会转换成二进制指令。

本节讲了C++的内存布局,下节我们介绍为什么使用动态内存分配。

最后

以上就是失眠石头最近收集整理的关于C++程序的内存分布C++程序的内存分布的全部内容,更多相关C++程序内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部