【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://myzitong.com/article/eipco.html