重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

【C++】内存分区-创新互联

目录

创新互联建站是一家朝气蓬勃的网站建设公司。公司专注于为企业提供信息化建设解决方案。从事网站开发,网站制作,网站设计,网站模板,微信公众号开发,软件开发,小程序设计,十余年建站对成都水泥搅拌车等多个行业,拥有丰富的网站营销经验。

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

代码区:

全局区:

图形理解:

栈区:

堆区:

new 关键字:


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

代码区:存放 函数体的二进制代码 ,由操作 系统管理
全局区:存放 全局变量 和 静态变量 以及 常量
栈  区:  由 编译器自动分配释放,存放函数的参数值、局部变量等
堆  区:  由 程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

不同区域存放的数据,赋予不同的生命周期

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

代码区:

存放在 cpu 执行的机器指令

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

-

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

全局区:

存放全局变量和静态变量

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

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

全局变量:创建在函数体外的变量都是全局变量,由下图可知 全局变量 和 局部变量 不在内存的同一块区域

静态变量:普通变量前面加上 static ,属于静态变量,由下图可知,全局变量 和 静态变量在内存的同一块区域

常量:

字符串常量(双引号""),由下图可知,字符串常量 和 全局变量、静态变量 在内存中的同一块区域

const 修饰的全局常量 ,由下图可知 const 修饰的全局常量 和 全局变量、静态变量 、字符串常量是在内存的同一块区域

const 修饰的局部变量,右下图可知,局部变量 和 const 修饰的局部常量 在内存的同一块区域

图形理解:

栈区:

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

-

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

// 栈区的数据疏议事项
// 栈区的数据由编译器自动释放

int* func()
{
    int a = 10; // 局部变量 , 存放在栈上, 栈区的数据在函数执行完后自动释放
    return &a;  // 返回局部变量地址
}

int main()
{
    int* p = func();
    cout<< *p<< endl; // 第一次编译器给数据做了一次保留,属于非法操作
    cout<< *p<< endl; // 数据不在保留
    system("pause");
    return 0;
}

warning C4172: 返回局部变量或临时变量的地址: a

返回的地址内存并在我们自己手里,这个管理权力在系统手里,系统随时都可以更改这块内存中的内容,为了避免出现意想不到的结果,所有不能返回局部变量地址

堆区:

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

-

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

利用 new 关键字,可以将数据开辟到堆区,new 返回内存编码

function 中的指针本质也是局部变量,放在 栈区,指针保存的数据放在堆区

int* function()
{
    int* a = new int(10); // 开辟到堆区
    // new 返回地址编号,括号里的 10 是给这个值赋值为 10
    return a;
}

int main()
{
    // 在堆区开辟数据
    int* p = function();

    cout<< *p<< endl;
    cout<< *p<< endl;

    system("pause");
    return 0;
}
new 关键字:

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

释放操作符 delete

语法:

new  数据类型

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

new 数据类型(整形1);  ,表示为 整形1 开辟一个整形的数据空间

利用 delete 关键字 释放 new 开辟的内存空间

// 1、 new 基本语法
int* funct()
{
    // 在堆区创建整形的数据
    // 返回该数据类型指针
    int* p = new int(10);
    return p;
}


void test01()
{
    int* p = funct();
    cout<< *p<< endl;
    cout<< *p<< endl;
    cout<< *p<< endl;
    // 堆区的数据由程序员管理释放
    // 释放使用关键字 delete 指针
    delete p;
    cout<< *p<< endl;
}


int main()
{
    test01();
    system("pause");
    return 0;
}

警告    C6001    使用未初始化的内存“p”。

new 数据类型加上 [整形] ;,表示申请 整形 个元素的数组,返回数组连续空间的首地址

void test02()
{
    // 创建 10 整形数据的数组,在堆区
    int* arr = new int[10]; // 10 代表数组有 10 个元素,返回连续空间的首地址
    for (int i = 0; i< 10; i++)
    {
        arr[i] = i + 1; // 1 - 10
    }
    for (int i = 0; i< 10; i++)
    {
        cout<< arr[i]<< " ";
    }
    cout<< endl;
}


int main()
{
    test02();
    system("pause");
    return 0;
}

delete 释放数组

delete [] 指针; // 释放数组的时候要加  [ ] (方括号),不加 [ ]  则只会释放一个指针

//释放堆区数组
delete[]arr;

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站题目:【C++】内存分区-创新互联
分享链接:http://cqcxhl.com/article/eipco.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP