相信大家在做力扣题时,经常要用到动态内存申请吧😍😍😍
那么什么是动态内存申请呢?
在进程的地址空间中,代码区、常量区、全局数据区的内存在程序启动时就已经分配好了,它们大小固定,不能由程序员分配和释放,只能等到程序运行结束由操作系统回收。这称为静态内存分配,我们平常在主函数里定义的各种变量基本上都是属于这类哈😉。
栈区和堆区的内存在程序运行期间可以根据实际需求来分配和释放,不用在程序刚启动时就备足所有内存。这称为动态内存分配😉。
为什么要用到动态内存申请呢?
相信大家在敲代码的时候,经常会遇到这种情况:不确定数组该定义多大,定义的大了是浪费内存,小了吧动不动就会出现数组越界,好犹豫啊!没关系动态内存申请就很好解决了这个问题,咱用多少他就能给咱分配多少:😀
那么怎样进行动态内存申请呢🤔,当然离不开我们的动态内存申请函数了。
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 分配内存更加简单😍:
1.int *p = new int; //分配1个int型的内存空间
2.delete p; //释放内存
new 操作符会根据后面的数据类型来推断所需空间的大小。
如果希望分配一组连续的数据,可以使用 new[]:
1.int *p = new int[10]; //分配10个int型的内存空间
2.delete[] p;
用 new[] 分配的内存需要用 delete[] 释放,它们是一一对应的。
和 malloc() 一样,new 也是在堆区分配内存,必须手动释放,否则只能等到程序运行结束由操作系统回收。为了避免内存泄露,通常 new 和 delete、new[] 和 delete[] 操作符应该成对出现,并且不要和C语言中 malloc()、free() 一起混用😬。
在C++中,建议使用 new 和 delete 来管理内存,它们可以使用C++的一些新特性,最明显的是可以自动调用构造函数和析构函数🤗
好了,今天的内存申请就先讲这么多😜,今天算是我正式写的第一篇博客,内容还有很多不足之处还望各位码友见谅😝
不说了,要去干饭了🤪,大家在新的学期一起加油💪💪💪
下期预告:你真的会用排序函数吗?