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++ 内存分区内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MFC自定义消息的实现方法

    MFC自定义消息的实现方法

    这篇文章主要介绍了MFC自定义消息的实现方法,通过该示例可以更好的理解MFC的消息封装机制,以便更加灵活的打造个性化的windows应用程序,需要的朋友可以参考下
    2014-07-07
  • 基于C语言代码实现扫雷游戏

    基于C语言代码实现扫雷游戏

    这篇文章主要为大家详细介绍了基于C语言代码实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 基于C++实现酒店管理系统

    基于C++实现酒店管理系统

    这篇文章主要为大家详细介绍了基于C++实现酒店管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C语言实现简单弹球游戏

    C语言实现简单弹球游戏

    这篇文章主要为大家详细介绍了C语言实现简单弹球游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • c语言版本二叉树基本操作示例(先序 递归 非递归)

    c语言版本二叉树基本操作示例(先序 递归 非递归)

    这篇文章主要介绍了实现二叉树的创建(先序)、递归及非递归的先、中、后序遍历
    2013-11-11
  • 深入解读C语言中的符号常量EOF

    深入解读C语言中的符号常量EOF

    这篇文章主要介绍了C语言中的符号常量EOF,文中还介绍了EOF的验证和打印方法,需要的朋友可以参考下
    2015-11-11
  • NDK 数据结构之队列与栈等的实现

    NDK 数据结构之队列与栈等的实现

    这篇文章主要介绍了NDK 数据结构之队列与栈等的实现的相关资料,希望通过本文大家能理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下。
    2015-11-11
  • VSCode配置C语言环境的方法

    VSCode配置C语言环境的方法

    这篇文章主要介绍了VSCode配置C语言环境的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • C语言 八大排序算法的过程图解及实现代码

    C语言 八大排序算法的过程图解及实现代码

    排序是数据结构中很重要的一章,本文主要为大家介绍了常用的八个排序算法(插入,希尔,选择,堆排,冒泡,快排,归并,计数)的过程及代码实现,需要的朋友可以参考一下
    2021-12-12

最新评论