1.关于几个区域的划分
代码区:存放二进制文件(程序运行前就创建)
全局区:存放全局变量,静态变量和常量(运行前)
栈区;里面存入方法,使用方法的时候是弹出栈操作,里面放入局部变量,数组之类的(运行中)
堆区:里面存入的是手动new出来的(运行中)
(注意,生命周期和作用域不要混淆)
2.关于代码区;
代码区是在程序运行前就存在的,里面的文件允许共享(既是内存中只有一份,反复执行也只是这一段代码),还有只读性(防止在执行过程中被修改)
3.关于全局区域
经过验证可知,这些东西的地址确实是挨着的
-------------------------------------------------------------------------------
全局区域中存在的东西为
const修饰的全局变量(全局常量) 静态变量
字符串常量(例如"hahaha"直接括起来) 全局变量
----------------------------------------------------------------------------------
而不存在的东西为
const修饰的部分变量(部分常量)
部分变量
全局区域总结
1.常量分为三种(全局常量,字符串常量,局部常量),不全是在全局中
const int a=12;
#define pi 3.1415926//两种常量
int main(){
cout<<"hahahah";//字符串常量
const int a=12;//局部常量
}
2.只要是局部,就一定不在全局区里面
3.全局区的生命周期从程序开始到结束
三.关于栈区
1.栈区中存在的应该是;局部变量 , 局部常量 , 形参数据
2.栈的生命周期应该是到方法结束为止,里面的内存全部释放掉.
but这里遇到了一点问题
形成原因为;
(解释有理有据--------------)
总之尽量不要返回局部变量的地址,太混乱了,返回数值就i行了
4.关于堆区域;
1.是程序员手动用new语句创建的,但是这个生命周期和java不一样,java底层利用虚拟机干掉了用完的new(程序结束).这个的生命周期有一点长.........需要手动delete
关于new的使用....
new int(12);//这里会自动创建一个地址开辟空间
//而且返回值也是地址,所以要用指针接收
int* p = new int(10);//没有变量名字,直接出指针了
//记得手动删除!
delete(p);
//关于new关键字;
//1.返回值是一个地址,必须用指针接收,相当于java的底层
//2.一定要记得删除delete name;
int* modify() {
int * arr = new int[10];
//3.由于数组的第一个地址也是数字,所以用对应数据类型作为指向也可以
for (int i = 1; i <= 10; i++) {
arr[i-1] = i;
}
return arr;
}
int main() {
int* point = modify();
for (int i = 1; i <= 10; i++) {
cout << *point << endl;
point++;
}
//4.使用完这里记得要delete一下子;
delete[] point;//4.指明这是一个数组,一次要删除一大串而不仅仅是这里
return 0;
}
详见一些内容和应用