C++程序内存栈区与堆区模型案例分析

 更新时间:2022年03月30日 09:22:16   作者:Zachery.  
一直以来总是对这个问题的认识比较朦胧,我相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢,让我们一起来看看

栈区:

由编译器自动分配释放,存放函数的参数值,局部变量等(由编译器管理其“生死”)

注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放

栈区代码演示:

//内存四区-栈区
/* 栈区:
由编译器自动分配释放,存放函数的参数值,局部变量等(由编译器管理其“生死”)
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
*/
#include <iostream>
using namespace std;
 
//栈区数据注意事项 --- 不要返回局部变量的地址
//栈区数据由编译器管理开辟和释放
 
int * func(int b) //形参数据也会放到栈区
{
    b = 100;
    int a = 10; //局部变量 存放在栈区,栈区的数据在函数执行完后自动释放,当此函数执行完,栈上的数据就清空了
    retern &a;  //返回局部变量的地址
}
int main() {
 
    //接受func函数的返回值
    int * p = finc(1);
    cout << *p << endl; //第一次可以打印正确的数字,是因为编译器做了一次保留
    cout << *p << endl; //第二次这个数据就不再保留了
 
    return 0;
}

堆区:

由程序员分配释放,若程序员不释放,程序结束后由操作系统回收(运行期间你不管,它就不释放。运行结束就给他回收掉)

在C++中主要利用new在堆区开辟内存

堆区代码演示:

/* 堆区:
 * 由程序员分配释放,若程序员不释放,程序结束后由操作系统回收(运行期间你不管,它就不释放。运行结束就给他回收掉)
 * 在C++中主要利用new在堆区开辟内存
 */
#include <iostream>
using namespace std;
 
int * func()
{
    //利用new关键字 可以将数据开辟到堆区
    //指针本质也是局部变量,放在栈上,指针保存的数据是放在堆区
    int * p = new int (10); //用指针去接收这块内存,new创建这块内存,把地址返回给你
    return p;
}
int main() {
    //在堆区开辟数据
    int *p = func();
    
    cout << *p << endl;
    cout << *p << endl;
    cout << *p << endl;
    cout << *p << endl; //一直存活
    
    return 0;
}

new操作符:

C++中利用new操作符在堆区开辟数据

堆区开辟数据,由程序员手动开辟,手动释放,释放利用操作符delete

语法:new 数据类型

利用new创建的数据,会返回该数据对应的类型的指针

new操作符代码演示:

#include <iostream>
using namespace std;
 
//1、new的基本语法
int * func()
{
    //在堆区创建整型数据
    //new返回的是:该数据类型的指针
    int * p = new int(10);
    return p;
}
 
void test01()
{
    int * p = func();
    cout << *p << endl;
    cout << *p << endl;
    cout << *p << endl;
    //堆区的数据由程序员管理开辟,程序员管理释放
    //如果想释放堆区的数据,利用关键字delete
    delete p;
    cout << *p << endl; //此处程序报错:内存已经释放,再去访问就是非法操作
}
 
//2、在堆区利用new开辟数组
void test02()
{
    //创建10整型数据的数组,在堆区
    int * arr = new int [10]; //10代表数组有10个元素
    for(int i=0;i<10;i++)
    {
        arr[i]=i+100;//给10个元素赋值100~109
 
    }
    for(int i=0;i<10;i++)
    {
        cout<<arr[i]<<endl;
    }
    //释放堆区数组
    //释放数组的时候,要加一个[]才可以
    delete[] arr;
}
int main() {
    //test01();
    test02();
 
 
    return 0;
}

到此这篇关于C++程序内存栈区与堆区模型案例分析的文章就介绍到这了,更多相关C++ 内存分区内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • DevC++如何自定义头文件并使用

    DevC++如何自定义头文件并使用

    文章介绍了如何在DevC++中自定义头文件并使用,首先创建一个项目,然后新建一个头文件并编写代码,保存后创建一个源文件并将其放在项目目录下
    2024-11-11
  • C语言中实现KMP算法的实例讲解

    C语言中实现KMP算法的实例讲解

    KMP算法即字符串匹配算法,C语言中KMP可以避免指针回溯从而达到高效,接下来就来总结一下C语言中实现KMP算法的实例讲解
    2016-06-06
  • C++ Boost MultiIndex使用详细介绍

    C++ Boost MultiIndex使用详细介绍

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • 使用C++一步步实现俄罗斯方块

    使用C++一步步实现俄罗斯方块

    本文给大家分享的是作者在使用C++制作俄罗斯方块的时候的思路分析以及开发准备和实验原理,都是些基础的知识储备,希望大家能够喜欢,具体的代码我们下一节再分享给大家
    2017-12-12
  • C语言实现出栈序列合法性判定

    C语言实现出栈序列合法性判定

    这篇文章主要为大家详细介绍了C语言实现出栈序列合法性判定,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • 一个string类的简单实现案例

    一个string类的简单实现案例

    下面小编就为大家带来一篇一个string类的简单实现案例。小编觉得挺不错的现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 用C语言实现扫雷游戏

    用C语言实现扫雷游戏

    这篇文章主要为大家详细介绍了用C语言实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C/C++可变参数函数的实现

    C/C++可变参数函数的实现

    这篇文章主要介绍了C/C++可变参数函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • C语言学生学籍管理系统课程设计

    C语言学生学籍管理系统课程设计

    这篇文章主要介绍了C语言学生学籍管理系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C++实现猴子吃桃的示例代码

    C++实现猴子吃桃的示例代码

    这篇文章主要介绍了C++实现猴子吃桃的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02

最新评论