1.C++执行程序时内存大致分为四个部分:
(前两部分运行前就存在,后两部分运行后才存在)
1)代码区:(.exe执行前就存在,共享,只读,由操作系统管理)
存放二进制代码
2)全局区:(执行前就存在,由操作系统管理)
数据在程序结束后由系统释放
存放全局变量 和 静态变量 和各种常量…(常量)
注解:常量又分为:
- 字符串常量
- const修饰的变量
- const修饰的全局变量//上面的相距都不远
- const修饰的局部变量 //不在全局区
(注:局部(local)变量和全局(global)变量放在不同的区域里!)
3)栈区:编译器分配回收(高地址到低地址)
存放局部变量 函数参数
注解:!!!不要return局部变量的地址!!!
int* func()//即使定义指针类型,
{
int a=10;
return &a;
}//执行完成之后会清空栈中数据,返回地址没有意义
int main()
{
int* p=func();
cout<<*p<<endl;//输出10,编译器暂时作保留
cout<<*p<<endl;//解引用时这里的数据被回收了,显示乱码
}
4)堆区:程序员分配回收或操作系统回收(低地址到高地址)
new 运算符(也是关键字),在堆区开辟数据
int* func()
{
int* p=new int(10);//核心:new的返回值是个存放在栈区,指向堆区某数据的指针!!
//指针的本质是“局部变量”,放在栈区,指针被回收,
指针所指的值放在堆区
return p;
}
int main()
{
int* p=func();//就好比把一个临时变量赋给另一个存活时间比它长的变量,
另一个变量的值就是temp了,无论temp回收与否
cout<<*p<<endl;
cout<<*p<<endl;//上下一致
}
2.new和delete运算符
1)基本语法
2)在堆区开辟数组
int* func()
{
int* p = new int(10);//开辟堆区存放数据值10,返回值为其地址
return p;
}
void test01()
{
int* p = func();
cout << *p << endl;
delete p;
cout << *p << endl;//引发读取访问权限冲突
}
void test02()
{
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();
return 0;
}