内存管理基础
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
1、全局/静态存储区
全局变量和静态变量被分配到同一块内存中,在以前的c语言中,全局变量又分为初始化的和未初始化的,在c++里面没有这个区分了,他们共同占用同一块内存。
2、常量存储区
这是一块比较特殊的存储区,里面存放的是常量,不允许修改。
静态常量区: 只读,大小固定,无法管理
3、堆
由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表
堆的大小较大,甚至可以申请到内存消耗完;主动分配,主动回收;堆地址想着地址增大方向发展,
堆的分配/回收方式:
malloc/calloc ->free
new ->delete
new T[] ->delete[]T
4、栈
由编译器在需要的时候分配,在不需要的时候自动清除的变量存储区。里面通常是局部变量,函数参数等。
被动分配,被动回收,大小由系统限制,
栈的内存地址是,下面地址大,上面地址小,
且在函数体内不要定义特别大的数据和矩阵。
大小在运行期有一个动态调整过程。
5、自由存储区
由malloc等分配的内存块,和堆十分相似,不过它使用free来结束自己的生命。
指针
指针指向内存:
int:4个字节
char:1个字节
指针的基本操作:
赋值
强转:
解引用:
int e = 10;
int* p = &e; //p是e的指针;
int** pp = &p; //pp是指向指针的指针
int*** ppp = &pp; //ppp是指向指针的指针的指针
//解引用
int ee = *(*(*ppp));
cout<<"ee="<<ee<<endl; //运行结果:ee=10
加减