C++ 动态内存分配

虽然很多时候感觉写这些东西没有什么含金量,但是心情较为平静想要学习的时候还是想写下来,慢慢的去写,作为一种心态的磨练吧!

声明:多数语言采集于老九学堂外加上自己一些简单的理解 。 B站上搜索即可,C++讲的确实不错。

使用new分配内存

1. 话说这是指针的真正的勇武之地 :在运行阶段分配未命名的内存用以存储值,所谓运行阶段就是当程序执行到这一条语句的时候才为这个变量分配未使用的内存空间也就是上句话所谓的未命名空间 来存储值。在这种情况下,只能使用指针来访问内存。

比如int num;这种定义在计算机编译的时候计算机就已经为变量num分配了四个字节的内存空间,直到程序结束这个空间才被释放。这种就是编译阶段就已经分配内存的。请搞清楚编译和运行这两个阶段的区别。

int * ptr_int = new int;

这句话就是在运行阶段为一个整形数据分配一个未命名的内存,哈哈感觉这里突然又有了新的理解,所谓的未命名是指这个整形空间没有对应的变量名字,哈哈也不知道这样理解对不对?,比如 int num ;这个整形空间的分配,是分给了这个num,num就是一个名字啊 。= 的右边这句话是分配了一个四个字节的内存,然后把这个内存的地址给左侧的指针变量 ptr_int .那么就说此时指针int_ptr这个指针变量指向了一个四个字节的内存空间。

delete ptr_int;

这句话就是释放掉内存。分配了还要释放掉,这个需要与new进行搭配使用,不要重复释放,不要释放声明变量释放的内存。

p -栈区         new int :在堆区分配了一块int型的空间

可以执行ptr_int ++;此时这个指针变量指向了新的内存空间,上面new int 分配的内存空间也依然存在,这时候没有一个指针指向的内存空间,称之为空间泄露。老九学堂说也可以称之为 “野指针”  他是不是口误了啊  野指针不是没有给他分配地址的指针啊,这不是分配了呀,咱也不知道,哈哈。理解的还是不太到位。尽量少用ptr_int++,太危险。所以使用完成之后记得释放内存

这是执行的结果,我觉得从这个图上并不能显示出来所谓的编译时和运行时啊 !nums本来就是一个整形指针变量,怎么测量都是四个字节啊。嘿嘿 不过发现一个问题,数组名字不是指针,是个地址吗,那为什么第一个输出sizeof(num) 是20 而不是4呢?说明他俩还是有一定的差异的,咱也就不知道了,有机会在查询吧,不过注意数组名是个指针常量,是不能被修改的!这点注意。

使用new创建动态分配的数组

int * intArray = new int [10]

使用delete[]释放内存

delete [] intArray

补充充血:程序的内存分配,这些东西吧,看语句也明白点,还是不太彻底!

栈区(stack):由编译器 自动分配释放,一般存放函数的参数值,局部变量的值,操作方式类似于数据结构中的先进后出。

 int num = 90; 这个num就是存放在栈区  右边的90就是存放在常量区

double num[6] = {1,2,2,3,5,6} 这个数组名num也是存在栈区  同理 右边的数字存放在常量区

一般像这种常见的定义,左边的变量名字 存在栈区,右边的常量都存在常量区

堆区(heap):一般由程序员分配释放,若不释放,程序结束时可能由操作系统回收,话说为啥时可能呢?难道还有不可能?分配方式类似于链表,一个挨着一个。

           double * dArray = new double[10]

          这个指针dArray就是在栈区,右边的new double[10]就是在堆区分配了10个double型的空间,真正的内容是存放在堆区的,只不过把这个堆区的首地址存放在了dArray这个指针里面。

全局区(静态区-static) 全局变量和静态变量是存储在一起的,程序结束后由系统释放

           int num = 11;这就是全局区

文字常量区:常量和字符串存放在这里,程序结束后由系统释放

程序代码区:存放函数体的二进制代码

 

栈区的效率高,堆区的效率低,举个例子

int num = 90;栈区一句话完事 换到堆区:int *p = new int; *p = 90;自然效率就低。请注意 p本身是在栈区中的!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值