IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 面向对象day1 C++核心编程 内存分区模块 -> 正文阅读

[C++知识库]面向对象day1 C++核心编程 内存分区模块

面向对象day1 C++核心编程 内存分区模块

贴图:
凤凰网财经
C++面向对象技术是C++的核心部分。以下分享内存分区模块内容。

参考:黑马程序员
开发环境:Microsoft Visual Studio

C++程序在执行时,将内存分为四块区域:

  1. 全局区
  2. 代码区
  3. 栈区
  4. 堆区

内容:

内存作用时间
全局区存放函数体的二进制代码,由操作系统进行管理程序运行前
代码区存放全局变量,静态变量,常量程序运行前
栈区由编译器自动分配和释放,存放函数的参数,局部变量程序运行后
堆区由程序员分配和释放,若程序员不手动释放,程序结束是操作系统回收程序运行后

存在的意义:

不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活性。

1.程序运行前

1.1.全局区

  • 全局变量和静态变量存放在此

  • 全局区还包含了常量区,字符串常量和其他常量也存放在此

该区域的数据在程序结束后由操作系统释放

#include<iostream>
using namespace std;

//创建全局变量
int g_a = 10;
int g_b = 10;

const int c_g_a = 10;
const int c_g_b = 10;
int main()
{
    //全局区
    //全局变量 静态变量 常量
    //创建一个普通的局部变量
    int a = 10;
    int b = 10;

    cout << "局部变量a的地址" << (int)&a << endl;
    cout << "局部变量b的地址" << (int)&b << endl;

    cout << "全局变量g_a的地址" << (int)&g_a << endl;
    cout << "全局变量g_b的地址" << (int)&g_b << endl;

    //静态变量
    static int s_a = 10;
    static int s_b = 10;

    cout << "静态变量s_a的地址" << (int)&s_a << endl;
    cout << "静态变量s_b的地址" << (int)&s_b << endl;

    //常量 字符串常量 const修饰的变量(const修饰的全局变量  const修饰的局部变量)

    cout << "字符串常量的地址" << (int)&"Hello World!" << endl;;

    cout << "全局常量c_g_a的地址 " << (int)&c_g_a << endl;
    cout << "全局常量c_g_b的地址 " << (int)&c_g_b << endl;


    const int c_l_a = 10;
    const int c_l_b = 10;

    cout << "局部常量c_l_a的地址是 " << (int)&c_l_a << endl;
    cout << "局部常量c_l_b的地址是 " << (int)&c_l_b << endl;
    return 0;
}
//l-->local
//g-->global

1.2.代码区

  • 存放cpu执行的机器指令

  • ?代码是共享的,目的是对于频繁操作的程序只需要在内存中存放一份代码即可

  • ?代码是只读的,防止程序意外的修改了他的指令

2.程序运行后

2.1.栈区

  • 由编译器分配和释放,存放函数的参数值,局部变量等

注意事项:不要返回局部变量的地址,因为栈区开辟的数据会在函数调用结束后由编译器自动释放

示例:

#include<iostream>
using namespace std;
/*栈区存放局部变量和函数的参数
注意事项:不要返回局部变量的地址,因为栈区开辟的数据会在函数调用结束后由编译器自动释放
*/
int* func() {
    int a = 10;  //局部变量
    return &a; //试图返回局部变量的地址
}
int main()
{
    int* p = func();
    cout << *p << endl;//第一次可以返回局部变量的地址是因为编译器做了保留
    cout << *p << endl;//第二次无法返回局部变量的地址因为数据由编译器自动释放
    return 0;
}

2.2.堆区

  • 由程序员分配释放,若程序员不释放。程序结束时由操作系统回收。
  • 在c++中主要利用new运算符在堆区开辟内存
#include<iostream>
using namespace std;
//堆区内存由程序员开辟释放,c++中开辟内存的方法是使用new运算符
int* func(){
   //int a=10;
   //利用new运算符可以把数据存放在堆区
   int*p = new int(10);//int* p实际是栈区数据
   //返回的是程序员在堆区开辟的内存编号(该数据类型的指针)
   return p;
}

int main()
{
    int* p=func();
    cout<<*p<<endl;
    return 0;
}

3.new操作符

  • C++中利用new操作符在堆区开辟数据
  • 堆区开辟数据,由程序员手动开辟,释放利用操作符delete

语法:new 数据类型

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

#include<iostream>
using namespace std;
int* func(){
    int* p=new int(10);
    return p;
}

void test01(){
   int*p= func();
   cout<<*p<<endl;
   cout<<*p<<endl;//10  堆区数据由程序员管理释放
   delete p;

   //cout<<*p<<endl;
}
//利用new在堆区创建一个十个整形数据组成的数组
void test02(){
    int *arr=new int[10];
    int i;
    //遍历数组赋值
    for(i=0;i<10;i++){
        arr[i]=i+10;
    }
    //遍历数组打印
    for(i=0;i<10;i++){
        cout<<arr[i]<<endl;
    }
    delete[] arr;//释放堆区数组

    // for(i=0;i<10;i++){
    //     cout<<arr[i]<<endl;
    // }
}
int main()
{
    test01();
    test02();
    return 0;
}

下一篇:C++引用,函数的高级。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-22 13:21:43  更:2021-08-22 13:21:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 5:42:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计