大家好,我是爱敲代码的小儿
相信大家在做力扣题时,经常要用到动态内存申请吧
- 那么什么是动态内存申请呢?
文章图片
栈区和堆区的内存在程序运行期间可以根据实际需求来分配和释放,不用在程序刚启动时就备足所有内存。这称为动态内存分配。
- 为什么要用到动态内存申请呢?
文章图片
那么怎样进行动态内存申请呢,当然离不开我们的动态内存申请函数了。
malloc函数(这个主要用在c语言上)
- 原型:void* malloc (size_t size);
- 作用:在堆区分配 size 字节的内存空间。
- 返回值:成功返回分配的内存地址,失败则返回NULL。
注意:分配内存在动态存储区(堆区),手动分配,手动释放,申请时空间可能有也可能没有,需要自行判断,由于返回的是void*,建议手动强制类型转换。例如:
int *p = (int *)malloc(1024);
这里malloc的传入参数为申请内存的字节数,返回值为申请到的内存的首地址,是什么类型的地址,就要强转成什么类型 ,这里的指针类型是整形,所以要强制类型转换(int*)
这里的 p 代表的是申请到的内存,并且有效内存字节数为 1024。
如果我们要申请一个长度为 n的整型数组的内存,可以这么写:
int *p = (int *)malloc( sizeof(int) * n );
??其中
sizeof(int)
表示的是一个int
占用的字节数,那么一个长度为 n 的int
类型的数组,需要的字节数自然就是 sizeof(int) * n
,有相应的内存申请,就要有对应的内存释放。malloc函数对应的内存函数是free函数,比如当我们上面申请的指针 p 使用过了,我们就可以用free(p)释放我们刚才申请的内存。tips:千万不要忘记及时释放内存呀!要是不释放的话,很容易造成内存泄漏这样严重的后果的
new和delete(多用于c++中) 在C++中,刚才说的malloc和free两个函数仍然可以使用,但是C++又新增了两个关键字,new 和 delete:new 用来动态分配内存,delete 用来释放内存。
用 new 和 delete 分配内存更加简单:
new 操作符会根据后面的数据类型来推断所需空间的大小。
- int *p = new int; //分配1个int型的内存空间
- delete p; //释放内存
如果希望分配一组连续的数据,可以使用 new[]:
用 new[] 分配的内存需要用 delete[] 释放,它们是一一对应的。
- int *p = new int[10]; //分配10个int型的内存空间
- delete[] p;
和 malloc() 一样,new 也是在堆区分配内存,必须手动释放,否则只能等到程序运行结束由操作系统回收。为了避免内存泄露,通常 new 和 delete、new[] 和 delete[] 操作符应该成对出现,并且不要和C语言中 malloc()、free() 一起混用。
在C++中,建议使用 new 和 delete 来管理内存,它们可以使用C++的一些新特性,最明显的是可以自动调用构造函数和析构函数
好了,今天的内存申请就先讲这么多,今天算是我正式写的第一篇博客,内容还有很多不足之处还望各位码友见谅
不说了,要去干饭了,大家在新的学期一起加油
【c++|c语言和c++中的动态内存申请与释放】下期预告:你真的会用排序函数吗?
推荐阅读
- leetcode|【学习报告】LeetCode零基础指南 (第二讲)函数
- C/C++中的void指针介绍和用法解析
- PAT甲级|PAT甲级备战-String
- PAT甲级|PAT甲级备战-高精度和排序
- 亿点点难的算法|PAT甲级备战-树(一)
- 项目攻坚|俄罗斯方块【六种模式】【c语言】【史上最强】
- 笔记|数据结构->二叉树的介绍
- 笔记|堆排序详解+TOP-K问题
- 有趣例题|力扣 142.环形链表