C++中的变量存储空间:数据区,代码区,文字常量区,堆,栈
C#的反射原理。
C++中的变量存储空间:数据区,代码区,文字常量区,堆,栈
相关链接:http://www.cppblog.com/oosky/archive/2006/01/21/2958.html
1,数据区:存储全局变量和静态变量的地方,由编译器编译前分配。
2,代码区:存储代码的空间,没有什么好解释的。
3,文字常量区:存储文字常量,编译器编译前分配,我认为跟数据区一个性质。
char *p="abcdefg";
"abcdefg"就存储在文字常量区。
4,堆。堆就是动态分配的内存区,比如用new 关键字,malloc函数分配的。
p=(char *)malloc(10);
p=new char[10];
堆非常重要,即是程序能量的源泉,也是麻烦的开始:
(1)堆是不在程序的“预算”之内的,向操作系统申请,操作系统还剩下多少内存,就能分配多少。
(2)堆是程序不会自动回收的。C++之所以麻烦,就是要自己回收用new,malloc分配的内存,经常我们弄不干净。
5,栈。去掉前面说的,剩下的就统统是栈了。下面的定义,只要不是全局变量,就都是栈
int i;
char c;
int i[10];
char p[]="abcdefg";
6.栈和文字常量区
char *p="abcdefg";//"abcdefg"在文字常量区
char p[]="abcdefg";//"abcdefg"在栈
7,堆和栈。
1),不管存储的数据的实际空间是在堆还是栈,指针总是存储在栈(只要不是静态或全局变量)。
int i[100]; //分配的存储空间在栈区,指针i在栈区
int *i=new int[100];//分配的存储空间在堆区,指针i在栈区
2),栈是程序预先分配的,有固定大小,int i[10000000000]应该是分配不到,但是用int i[]=new int[1000000000]说不定就可以。
3),栈是程序自动管理的,这句废话的真实意思是,当离开函数时,在这个函数里创建的空间就要被回收。
char *fun()
{
char p[]="abcde";
return p;
}
这个函数返回的空间指向的是乱码.为什么?“abcde”存储在栈区,对不起,函数结束,回收。
那好,我们可以用文字常量区——char *p="abcde"问题是,文字常量区一直都不释放,有点浪费,看情况。或者用堆区——
char *p=new char[5]{'a','b','c','d','e'},很好,这个空间会一直存在,从一个函数到另一个函数,知道程序结束它还存在,除非你记得释放这个存储空间——delete p;
PS:
- #include "stdafx.h"
- #include <iostream>
- using namespace std;
- char* fun3()
- {
- char *p="cdef";
- return p;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- cout<<fun3();
- int i;
- cin>>i;
- }
输出结果:"cdef"
这段代码说明一个简单的事实:即使是在子函数中,通过这种方法定义的字符串,一样是存储在字符串常量区