C / C ++中的动态内存分配是指程序员手动执行内存分配。动态分配的内存在堆上分配,非静态和局部变量在堆栈上分配内存。
有什么应用:
1.动态分配内存的一种用途是分配可变大小的内存,而可变长度数组除外,这是编译器分配的内存无法实现的。
2.最重要的用途是为程序员提供了灵活性。无论何时需要和不再需要,我们都可以自由分配和取消分配内存。在许多情况下,这种灵活性会有所帮助。此类情况的示例是“链表”,“树”等。
![e561e97cf6b681334cb6b358c584108b.png](https://img-blog.csdnimg.cn/img_convert/e561e97cf6b681334cb6b358c584108b.png)
它与分配给普通变量的内存有何不同?
对于“ int a”,“ char str [10]”等常规变量,将自动分配和释放内存。对于动态分配的内存,例如“ int * p = new int [10]”,程序员有责任在不再需要时释放内存。如果程序员不释放内存,则会导致内存泄漏(直到程序终止,内存才被释放)。
如何在C ++中分配/取消分配内存?
C使用malloc()和calloc()函数在运行时动态分配内存,并使用free()函数释放动态分配的内存。C ++支持这些功能,并且还有两个new和Delete运算符,它们以更好和更轻松的方式执行分配和释放内存的任务。
![e043f22ba0646ba12805e473fb7cfc48.png](https://img-blog.csdnimg.cn/img_convert/e043f22ba0646ba12805e473fb7cfc48.png)
新的运算符表示在免费存储上分配内存的请求。如果有足够的内存可用,则new运算符将初始化该内存,并将新分配和初始化的内存的地址返回给指针变量。
使用new运算符的语法:要分配任何数据类型的内存,语法为:
![66799644185e7157da8a6b9d83b7b04e.png](https://img-blog.csdnimg.cn/img_convert/66799644185e7157da8a6b9d83b7b04e.png)
这里,pointer-variable是数据类型的指针。数据类型可以是任何内置数据类型,包括数组,也可以是任何用户定义的数据类型,包括结构和类。
例:
![2bd7bce137f50075a8a37551ba99ac0c.png](https://img-blog.csdnimg.cn/img_convert/2bd7bce137f50075a8a37551ba99ac0c.png)
初始化内存:我们还可以使用new运算符来初始化内存:
![62851176972060ba3171daa23527d6a0.png](https://img-blog.csdnimg.cn/img_convert/62851176972060ba3171daa23527d6a0.png)
分配内存块: new运算符还用于分配data-type类型的内存块(数组):
![17ae6355cee8a042a77985f60a066276.png](https://img-blog.csdnimg.cn/img_convert/17ae6355cee8a042a77985f60a066276.png)
其中size(一个变量)指定数组中元素的数量:
![3e633cb09a1246b33f2e4252b93d5c29.png](https://img-blog.csdnimg.cn/img_convert/3e633cb09a1246b33f2e4252b93d5c29.png)
为int类型的10个整数连续动态分配内存,并将指针返回到序列的第一个元素,该元素分配给p(a指针)。p [0]表示第一个元素,p [1]表示第二个元素,依此类推。
![436878373e589b508af34d9fc31aa10c.png](https://img-blog.csdnimg.cn/img_convert/436878373e589b508af34d9fc31aa10c.png)
普通数组声明与使用new
声明普通数组与使用new分配内存块之间有区别。最重要的区别是,常规数组由编译器释放(如果数组是本地数组,则在函数返回或完成时释放)。但是,动态分配的数组始终保留在那里,直到程序员将其释放或程序终止为止。
如果运行时没有足够的内存怎么办?
如果堆中没有足够的内存来分配,则新请求将抛出std :: bad_alloc类型的异常,以指示失败,除非new操作符使用了“ nothrow”,在这种情况下它将返回NULL指针。因此,最好在使用new程序之前检查new产生的指针变量。
![c74bb4c40a887996717b0aeba984bc91.png](https://img-blog.csdnimg.cn/img_convert/c74bb4c40a887996717b0aeba984bc91.png)
由于取消分配动态分配的内存是程序员的责任,因此C ++语言为程序员提供了delete运算符。
句法:
![4caa2207b29e5da0038342028779f8aa.png](https://img-blog.csdnimg.cn/img_convert/4caa2207b29e5da0038342028779f8aa.png)
在这里,pointer-variable是指向由new创建的数据对象的指针。
例如:
![706be9a541a42b330767585c78afefbb.png](https://img-blog.csdnimg.cn/img_convert/706be9a541a42b330767585c78afefbb.png)
要释放指针变量指向的动态分配数组,请使用以下形式的delete:
![e7b82b366980e4ba25b42b4c89966336.png](https://img-blog.csdnimg.cn/img_convert/e7b82b366980e4ba25b42b4c89966336.png)
![c6495ab6375a8403012b08ea0c0d031f.png](https://img-blog.csdnimg.cn/img_convert/c6495ab6375a8403012b08ea0c0d031f.png)
输出:
![ce6562fcd8f0f41fe144709de7621656.png](https://img-blog.csdnimg.cn/img_convert/ce6562fcd8f0f41fe144709de7621656.png)
免费领取学习资料以及教程,私信我,或者看下方图片呀:
![4704d56cb6db87006901c7db20729edc.png](https://img-blog.csdnimg.cn/img_convert/4704d56cb6db87006901c7db20729edc.png)