首页 > 系统相关 >C++ - 内存管理

C++ - 内存管理

时间:2023-10-11 14:55:06浏览次数:32  
标签:10 管理 int 堆区 C++ 存放 内存 new

本阶段主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓。

1 内存分区模型

C++程序在执行时,将内存大方向划分为4个区域

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

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

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

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

 

 

 

内存四区意义:

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

 

 

1.1 程序运行前

在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域

代码区:

存放 CPU 执行的机器指令

代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可

代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令

全局区:

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

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

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

 

 

 

 

 

 

示例:

//全局变量
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;
​
    cout << "字符串常量地址为: " << (int)&"hello world" << endl;
    cout << "字符串常量地址为: " << (int)&"hello world1" << 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;
​
    system("pause");
​
    return 0;
}

打印结果:

1545017602518

 

总结:

  • C++中在程序运行前分为全局区和代码区

  • 代码区特点是共享和只读

  • 全局区中存放全局变量、静态变量、常量

  • 常量区中存放 const修饰的全局常量 和 字符串常量

 

 

1.2 程序运行后

 

栈区:

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

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

 

示例:

int * func()
{
    int a = 10;
    return &a;
}
​
int main() {
​
    int *p = func();
​
    cout << *p << endl;
    cout << *p << endl;
​
    system("pause");
​
    return 0;
}

 

 

 

堆区:

由程序员分配释放,若程序员不释放,程序结束时由操作系统回收

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

示例:

int* func()
{
    int* a = new int(10);
    return a;
}
​
int main() {
​
    int *p = func();
​
    cout << *p << endl;
    cout << *p << endl;
    
    system("pause");
​
    return 0;
}

 

总结:

堆区数据由程序员管理开辟和释放

堆区数据利用new关键字进行开辟内存

 

 

 

 

1.3 new与delete操作符

 

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

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

语法:new 数据类型

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

 

示例1: 基本语法

int* func()
{
    int* a = new int(10);
    return a;
}
​
int main() {
​
    int *p = func();
​
    cout << *p << endl;
    cout << *p << endl;
​
    //利用delete释放堆区数据
    delete p;
​
    //cout << *p << endl; //报错,释放的空间不可访问
​
    system("pause");
​
    return 0;
}

 

示例2:开辟数组

//堆区开辟数组
int main() {
​
    int* arr = new int[10];
​
    for (int i = 0; i < 10; i++)
    {
        arr[i] = i + 100;
    }
​
    for (int i = 0; i < 10; i++)
    {
        cout << arr[i] << endl;
    }
    //释放数组 delete 后加 []
    delete[] arr;
​
    system("pause");
​
    return 0;
}
​

 

 

标签:10,管理,int,堆区,C++,存放,内存,new
From: https://www.cnblogs.com/zhuchunlin/p/17757081.html

相关文章

  • C++ - 初识C++
    1C++初识1.1第一个C++程序编写一个C++程序总共分为4个步骤创建项目创建文件编写代码运行程序1.1.1创建项目VisualStudio是我们用来编写C++程序的主要工具,我们先将它打开 1.1.2创建文件右键源文件,选择添加->新建项给C++文件起个名称,然后点击添......
  • 群晖Synology存储空间管理器支持的RAID类型
    创建存储池时,先选择RAID类型。不同类型的RAID可提供不同级别的数据保护、存储功能及性能。SynologyNAS目前支持以下类型的RAID:Basic:使用一个硬盘来创建存储池。Basic存储池不提供数据冗余。JBOD*:至少合并两个硬盘来创建存储池。JBOD存储池不提供数据冗余。JBOD存储池......
  • C++ - 数据类型
    2数据类型C++规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存2.1整型作用:整型变量表示的是==整数类型==的数据C++中能够表示整型的类型有以下几种方式,区别在于所占内存空间不同:数据类型占用空间取值范围short(短整型)2字节(-2^......
  • C++ - 运算符
    3运算符作用:用于执行代码的运算本章我们主要讲解以下几类运算符:运算符类型作用算术运算符用于处理四则运算赋值运算符用于将表达式的值赋给变量比较运算符用于表达式的比较,并返回一个真值或假值逻辑运算符用于根据表达式的值返回真值或假值3.1算术......
  • 智慧工厂中的UWB定位技术及其在人员安全管理中的应用
    位置信息大数据定位平台源码 UWB高精度人员定位系统源码智慧工厂是产业升级的外在表现形式,利用物联网技术加强信息管理的新模式,人员定位管理通过物联网技术、位置信息大数据的综合处理应用,在智慧工厂人员管理方面具有独到的优势。UWB定位技术具有传输速率高,发射功率低,传统能力强等......
  • 常用的物联网管理系统分享
    常用的物联网管理系统主要有以下几种:智能家居系统:通过物联网技术,将家庭设备和电器互联起来,实现智能化控制和管理的系统。智能家居系统可以实现家庭设备的远程控制、智能化场景设置、安防监控等功能,方便用户提高家居生活的便利性和舒适度。智能工厂系统:利用物联网技术,通过互联的工......
  • C++ 完美转发
    完美转发定义完美转发指的是函数模板可以将自己的参数“完美”的转发给内部调用的其他函数中。所谓的完美,指的是不仅能准确的转发参数的值,还能保证被转发的参数的左、右值属性不变解决的问题在C++中如果想要将一个函数的参数转发给另一个函数时,需要保留原始参数的左右值......
  • kali-Java版本管理-update-alternatives
    kali-Java版本管理-update-alternativeshttps://blog.csdn.net/qq_44029310/article/details/126086895列出软件的所有版本update-alternatives--config软件名update-alternatives--configjava的示例输出Thereare3choicesforthealternativejava(providing/usr......
  • 《Mastering the FreeRTOS Real Time Kernel》读书笔记(1)堆内存管理
    这是161204的版本,不完全覆盖目前最新版本的内核。0.关于freeRTOS首先提出了了在小型嵌入式系统中为何需要多任务管理的问题,介绍了freeRTOS的用途。然后开始做广告,吹了一波freeRTOS的好处。其中要注意一些关键的名词:任务优先级分配、任务通知、队列、信号量、互斥锁、软定时器、......
  • Qt_C++读写NFC标签Ntag支持windows国产linux操作系统
    本示例使用的发卡器:ntag2标签存储结构说明#include"mainwindow.h"#include"./ui_mainwindow.h"#include<QDebug>#include"QLibrary"#include"QMessageBox"//本示例可在windows、linux系统内编译、运行//判断windows、linux系统,声明动态库函数---------------......