C++与C语言的内存区域划分
C++和C语言虽然在申请动态的内存的时候的方法略有不同. 但他们在计算机中的存储区域是相同的.
数据的存储形式主要是在1.栈 2.堆 3.数据段 4.代码段 这四个地方存储.
他们在内存上由上向下一次排开. 其中:
1.静态数据与全局的数据存储在数据段上.
2.局部变量定义的数据存储在栈上.
3.一动态内存申请方式申请的数据保存在堆上.
4.一些可执行的代码, 只读常量, 字符存储在代码段上.
C语言的动态内存申请
在C语言中动态内存的申请有三个函数malloc, calloc, realloc
他们三个的使用方法类似:
int *p = (int *)malloc(sizeof(int));
int *pp = (int*)calloc(2, sizeof(int));
int*ppp = (int *)realloc(pp, 2);
malloc函数只拥有一个参数, 是开辟空间的大小, 上述代码为开辟出存储一个整形变量的空间, 他的指针是P.
calloc函数拥有两个参数,一个是个数,一个是大小. 但不同的是calloc函数会在开辟空间的同时将开辟好的空间初始化成0;
realloc函数的作用是将已经申请好的空间进行大小的修改他也有两个参数一个是需要修改的空间的地址, 一个是需要修改的新的空间的大小. 它不仅仅能将小的空间修改成大的空间, 而且还可以将打的空间修改成小的空间. 其中在将小地址修改成大地址的时候会存在两种情况:
a. 当修改的空间的后续空间能满足新空间的大小的时候,原有的指针不会发生变化.
int *ppp=(int*)realloc(pp,3);
经pp指向的空间由两个大小改成三个.
int*ppp = (int *)realloc(pp.10000);
将pp指向的空间大小改成10000个.
b. 当修改的空间的后续空间不能满足秀新空间的大小的时候, realloc函数,会先将原来的空间释放掉, 在到一个新的地址开辟出一个新的空间.
在这里要注意当要将新的空间变为小的时候新的空间恰巧会与就的空间的地址相同
int*pp=(int *)calloc(2,sizof(int));
int *ppp=(int *)realloc(pp,1);
这里只指针pp与指针ppp指向的地址相同. 当进行空间的释放是.如果先释放ppp在释放pp会造成对空地址的释放.
C++的动态内存管理
C++的动态内存管理是由new与delete来完成的, new用来申请空间, dalete用来释放空间.
1.在对内置类型进行申请时
int *p1=new int;
int *p2=new int(10);
int *p3=new int[5];
delete p1;
delete p2;
delete[] p3;
上述代码分别对应, p1为申请一个整形常量. 而p2是在申请的时候直接进行初始化(代码中是将p2所指向的空间初始化为了10). p3是申请了一片大小为5,类型类整形的空间.
对前两者的空间进行释放的时候只需要直接在delete关键字之后加上要释放的地址的指针,而连续的空间需要在delete后加上[]再加上指针.