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< cout<<*p< } 4)堆区:程序员分配回收或操作系统回收(低地址到高地址) new 运算符(也是关键字),在堆区开辟数据 int* func() { int* p=new int(10);//核心:new的返回值是个存放在栈区,指向堆区某数据的指针!! //指针的本质是“局部变量”,放在栈区,指针被回收, 指针所指的值放在堆区 return p; } int main() { int* p=func();//就好比把一个临时变量赋给另一个存活时间比它长的变量, 另一个变量的值就是temp了,无论temp回收与否 cout<<*p< cout<<*p< } 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<
} delete[] arr;//释放堆区数组,注意加[] } int main() { test01(); return 0; }



