首页 理论教育 C++动态分配内存:使用malloc和free

C++动态分配内存:使用malloc和free

时间:2023-08-20 理论教育 版权反馈
【摘要】:malloc()函数可以在一个叫作堆的内存空间中分配指定字节数的内存。动手写6.3.1动手写6.3.1展示了malloc()和free()的应用。运行结果如图6.3.1所示:图6.3.1malloc()和free()的使用本示例中我们先使用malloc()分配了大小为“5 * sizeof”字节的内存。此外,由于malloc()返回void *指针,因此我们也要将返回值转换为需要的指针类型;分配完内存之后我们就用另一个指针来遍历这个动态的数组,最后需要记得调用free()函数释放内存。

C++动态分配内存:使用malloc和free

malloc()函数可以在一个叫作堆(Heap)的内存空间中分配指定字节数的内存。与作用域中在栈(Stack)中分配内存的局部变量不同,堆中的内存一旦分配,就不会自动被释放,直到程序调用free()函数。

动手写6.3.1

动手写6.3.1展示了malloc()和free()的应用。运行结果如图6.3.1所示:

图6.3.1 malloc()和free()的使用(www.xing528.com)

本示例中我们先使用malloc()分配了大小为“5 * sizeof(int)”字节的内存。malloc()的分配单位是字节,所以我们要用sizeof操作符获取整型int的字节数。此外,由于malloc()返回void *指针,因此我们也要将返回值转换为需要的指针类型;分配完内存之后我们就用另一个指针来遍历这个动态数组,最后需要记得调用free()函数释放内存。

对于动态数组来说,因为内存不会自动释放,所以如果我们遗漏free(),就会发生内存泄漏(Memory Leak),也就是说已分配的内存会一直被占用,别的程序就不能使用这一块内存了。这个概念可以用现实中更衣室的柜子来类比:更衣室的柜子在出租之后就会被上锁,顾客使用了一段时间后把东西拿了出来,关上柜子却忘记归还钥匙就离开了。这个情况下管理人员没有钥匙,尽管柜子是空的,却也不能再供给另一名顾客使用。堆中的内存也是如此,如果不释放,就算使用那块内存的程序已经终止,那块内存也是处于被占用的状态。

另一个值得注意的点是,在调用free()函数的时候我们不能使用ptr,而必须使用arr。这是因为ptr在遍历结束的时候指向动态数组的末尾元素,如果使用free()释放5 * sizeof(int)字节内存,就会触碰到最后一个元素后面未知的内存段。

提示

在C++程序中,如果使用动态内存分配,我们一定要让free()或delete与malloc()和new匹配,即在程序中一次内存分配一定要有相对应的一次相同大小的内存释放。释放多次相同的内存、没有释放内存以及释放内存大小不匹配都是不能接受的。

此外,在释放内存后将指针重新赋值为NULL是一个非常好的习惯。这是因为对指针用了free()之后并不会改变指针的值,也就是指向的地址。我们在之后的程序中可能会忘记这个地址的内存已经被释放,而再次使用这个指针,这就会导致程序异常。这个时候如果指针是NULL,就会被许多条件检查拦截(就像把指针初始化为NULL一样),从而避免很多潜在的问题。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈