#include <iostream>
int main(){
/*
1.使用new动态分配内存:
(1)指针真正的用武之地就是,在运行阶段让系统给指针分配一个没有被分配的内存空间,以便使用指针进行动态的存值.
(2)但在这种情况下,就只能通过指针来访问内存了.
(3)需要注意的是,使用指针及new分配的内存,需要在使用完之后,进行内存的释放.
eg:
//在运行阶段为一个int类型的值分配未命名的内存空间
int *p = new int;
//给该指针指向的空间进行赋值
*p = 90;
//释放给该指针指向空间分配的内存.
delete p;
(4)注意:不要创建两个指向统一内存地址的指针,因为这有可能在释放空间时,误删两次.
eg:
int * p1 = new int;
int * p2 = p1;
delete p1;
//导致同一块内存空间被释放了两次.
delete p2;
2.使用new创建动态分配的数组:
(1)
//这里要注意,你在使用new时,intArray还不能说是数组,而应该是一个指向一段连续内存空间的指针.且new运算符返回的是第一个元素的地址.
int * intArray = new int[10];
(2) 使用delete[]释放指针数组的内存
eg: delete [] intArray;
(3)注意了,delete只能释放用new的指针指向空间,对于普通的指针,是无法使用delete释放所指向空间的,不然会出问题的.
3.栈区:
(1)由编译器自动分配释放,一般存放函数的参数值,局部变量的值等
(2)操作方式类似数据结构中的栈-先进后出.
4.堆区:
(1)一般由程序员分配释放,如程序员使用new向系统申请分配的内存空间就是在堆区,且该空间的释放也是程序员通过delete进行.若程序不释放,程序结束时可能有操作系统自动回收
(2)注意:与数据结构中的堆是两回事,这里的堆分配内存空间,类似与链表.前一个空间和下一个空间之间是建立了一种逻辑上的连接,而非物理上的连续的几个内存空间.
5.全局区(静态区):
(1)全局变量和静态变量时存储在一起的,即都存储在全局区里
(2)全局区分配的内存空间,会在程序结束后,由系统进行统一的释放.
6.文字常量区:
(1)常量就放在这里,例如字符串常量,数字常量等,只要是常量那就是存放在文字常量区中.
(2)文字常量区的内存空间,也是在程序结束后由系统统一释放.
7.程序代码区:
(1)存放函数体的二进制代码.
eg:
//num1被存放在栈区
int num1;
//str[]被存放在栈区,"旺财"被存放在文字常量区
char str[] = "旺财";
//p1被存放在栈区
char * p1;
//"翠花"和"\0"被存放在文字常量区,p2被存放在栈区
char * p2 = "翠花";
//全局(静态)变量num2被存放在全局区,"1024"被存放在文字常量区
static int num2 = "1024";
//分配的内存在堆区,p1在栈区,new int[10]在堆区
p1 = new int[10];
p2 = new char[20];
*/
}
C++学习--动态分配内存,及栈区,堆区,全局区,常量区,程序代码区介绍
最新推荐文章于 2023-04-16 10:03:57 发布