C++程序在执行时,将内存大方向划分为4个区域
- 代码区:存放函数体的二进制代码,由操作系统进行管理的(程序狗写的)
- 全局区:存放全局变量和静态变量以及常量
- 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等
- 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收
代码区:
特点:共享(只有一份),只读(不可修改)
全局区:
存放全局变量和静态变量以及常量
static int a=10;静态常量。
注意:
程序在运行之前:
有全局区和代码区
代码区的特点是共享和只读
全局区有全局变量,静态变量,常量
常量区有const修饰的全局常量和字符串常量。
const修饰的局部常量,局部变量在栈区
程序运行之后:
栈区:
局部变量和形参都在栈区,
////由编译器自动分配释放, 存放函数的参数值(形参), 局部变量等
注意事项:不要返回局部变量的地址,
栈区开辟的数据由编译器自动释放
如下代码:
#include<iostream>
using namespace std;
#include<string>
#include <cstdlib>//解决system不明确问题。
#include<ctime>
int *dadd(int b) //b形参
{
b =100;
int a = 10;
return &a;
}
int main()
{
int* p= dadd(1);
局部变量和形参都在栈区,
////由编译器自动分配释放, 存放函数的参数值, 局部变量等
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
cout << *p << endl;
cout << *p << endl;
system("pause");
return 0;
}
堆区:
由程序员分配释放,若程序员不释放,程序结束时由操作系统回收。
在C++中主要利用new在堆区开辟内存。
指针其实也是一个局部变量,在栈区,但是指针可以进行存放堆区的地址 由new 搞定。
堆区由程序员决定其生死
#include<iostream>
using namespace std;
#include<string>
#include <cstdlib>//解决system不明确问题。
#include<ctime>
int *func() //b形参
{
//指针其实也是一个局部变量,在栈区,但是指针可以进行存放堆区的地址 由new 搞定。
int *p=new int (10);//new int(10)返回一个堆区的地址,由指针接收。
//堆区由程序员决定其生死
return p;
}
int main()
{
int* p= func();//在堆区开辟数据。
cout << *p << endl;
cout << *p << endl;
system("pause");
return 0;
}
**C++中利用==new==操作符在堆区开辟数据**
堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符 delete
语法:new 数据类型
利用new创建的数据,会返回该数据对应的类型的指针
1.基本语法。
2.堆区开辟数组。
代码如下:
#include<iostream>
using namespace std;
#include<string>
#include <cstdlib>//解决system不明确问题。
#include<ctime>
int *func() //b形参
{
int *p=new int (10);
return p;
}
void test01()//1.基本语法
{
int* p = func();
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;
delete p;//释放堆区数据
cout << *p << endl;//报错,释放后不可操作。
}
void test02()//2.堆区开辟数组
{
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 [] arr;
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}