提示:本文是对课堂相关材料、知识的汇总笔记
前言
如果能够根据需要多少就分配多少内存就好了~
cin>>n;
int a[n];
然而我们都知道,声明一个数组,给他分配内存,其大小必须是确定的。在学习了指针之后,我们进一步学习了动态分配内存的相关知识,对于内存的利用率极大地提高。
一、动态分配内存之malloc/free
解决前述问题的办法:
定义一个指针,然后把动态分配的内存空间的起始地址保存在该指针中,如:
int *scores;
scores = (int*) malloc(n * sizeof(int));
1.malloc
来看看malloc的函数原型:
void *malloc(size_t size)
功能:在堆中申请一块内存;
参数:申请的字节数;
返回值:一个指向该内存的指针或NULL;
头文件:stdlib.h
函数表示返回一个地址(指针),void表示对该地址的访问方式待定,即我们使用时需要进行指定其访问地址的类型,告诉计算机以何种方式获得信息。例如上式,(int*)强制转换为指向int类型元素的指针。
函数的参数是动态请求内存的大小。对于请求一个数组(如int)的内存空间,由于数组每个元素的类型都一样,可以用sizeof()函数获得一个类型元素的内存大小,再乘以需要数组的大小n即可。

为什么可以动态分配内存呢?
这是因为,一般是在栈中分配内存,而动态分配内存是在堆中
堆中的特点:
1)只能通过malloc/new进行分配(c语言)
2)分配的内存空间不会自动释放,需要程序员使用free/delete进行释放
2.free
free的函数原型:
void free(void *ptr)
功能:释放堆中的一块内存;
参数:指向内存首地址的指针;
返回值:无;
头文件:stdlib.h
变量不用了就给我释放,明白?(这该死的霸道
二、动态分配内存之new/delete态内存分配之new/delete
c++动态分配内存的方式更精简实则也更强大(对象里面构造时也会用到new)
int *scores = new int[n];
new/delete: 动态申请和释放内存
int* pInt = new int;
Student* pStu = new Student;
delete pInt;
delete pStu;
new[]/delete[]:动态申请和释放内存
int* pInt = new int[n];
Student* pStu = new Student[n];
delete [] pInt;
delete [] pStu;
总结
动态分配内存对于一些输入未知、组数众多数据变化多的问题,能够避免爆栈等优点,必须得掌握。事实上,对于结构体对象、自定义对象等等,新创建一个对象、构造函数等等也蕴含动态分配内存的知识。
本文介绍了如何使用malloc/free动态分配内存以及new/delete在C++中的应用,包括内存动态请求、内存释放的原则,以及它们在处理数组和对象时的区别。重点在于提升内存利用效率和避免栈溢出问题。
7650

被折叠的 条评论
为什么被折叠?



