c语言提供内存动态分配的函数有:malloc、calloc、realloc,在使用这些函数时必须包含其头文件,分别为:<malloc.h>、<stdlib.h>、<alloc.h>
<wbr><wbr><wbr><wbr>1) malloc 函数: void *malloc(unsigned int size)</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr>在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。</wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>2)calloc 函数: void *calloc(unsigned int num, unsigned int size)</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr>按照所给的数据个数和数据类型所占字节数,分配一个 num * size 连续的空间。</wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>calloc申请内存空间后,会自动初始化内存空间为 0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>3)realloc 函数: void *realloc(void *ptr, unsigned int size)</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>动态分配一个长度为size的内存空间,并把内存空间的首地址赋值给ptr,把ptr内存空间调整为size。</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>申请的内存空间不会进行初始化。</wbr></wbr></wbr></wbr>
释放的函数为free函数: <wbr><p><wbr><wbr><wbr>free函数原型为:void free(void *ptr)</wbr></wbr></wbr></p> <p><wbr><wbr><wbr>作用:释放由上面3种函数所申请的内存空间。</wbr></wbr></wbr></p> <p><wbr><wbr><wbr>参数:ptr:指向需要释放的内存空间的首地址。</wbr></wbr></wbr></p> <p><wbr></wbr></p> <p><wbr><wbr><span style="font-size:14px">在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。</span></wbr></wbr></p> <p><span style="font-size:14px"><wbr><wbr>申请和释放堆中分配的存储空间,分别使用new 和 delete 的两个运算符来完成:</wbr></wbr></span></p> <p><span style="font-size:14px"><wbr><wbr><wbr>指针变量名 = new 类型名(初始化式);</wbr></wbr></wbr></span></p> <p><span style="font-size:14px"><wbr><wbr><wbr>delete 指针名;</wbr></wbr></wbr></span></p> <p><span style="font-size:14px"><wbr><wbr><wbr>例如:</wbr></wbr></wbr></span></p> <p><span style="font-size:14px"><wbr><wbr><wbr><wbr>int *pi = new int(0)</wbr></wbr></wbr></wbr></span></p> <p></p> <p>malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可以用于申请动态内存和释放内存。</p> <p>对于非内部数据类型对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free.</p> </wbr><wbr><wbr><wbr><wbr>1) malloc 函数: void *malloc(unsigned int size)</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr>在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。</wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>2)calloc 函数: void *calloc(unsigned int num, unsigned int size)</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr>按照所给的数据个数和数据类型所占字节数,分配一个 num * size 连续的空间。</wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>calloc申请内存空间后,会自动初始化内存空间为 0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>3)realloc 函数: void *realloc(void *ptr, unsigned int size)</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>动态分配一个长度为size的内存空间,并把内存空间的首地址赋值给ptr,把ptr内存空间调整为size。</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>申请的内存空间不会进行初始化。</wbr></wbr></wbr></wbr>
释放的函数为free函数: <wbr><p><wbr><wbr><wbr>free函数原型为:void free(void *ptr)</wbr></wbr></wbr></p> <p><wbr><wbr><wbr>作用:释放由上面3种函数所申请的内存空间。</wbr></wbr></wbr></p> <p><wbr><wbr><wbr>参数:ptr:指向需要释放的内存空间的首地址。</wbr></wbr></wbr></p> <p><wbr></wbr></p> <p><wbr><wbr><span style="font-size:14px">在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。</span></wbr></wbr></p> <p><span style="font-size:14px"><wbr><wbr>申请和释放堆中分配的存储空间,分别使用new 和 delete 的两个运算符来完成:</wbr></wbr></span></p> <p><span style="font-size:14px"><wbr><wbr><wbr>指针变量名 = new 类型名(初始化式);</wbr></wbr></wbr></span></p> <p><span style="font-size:14px"><wbr><wbr><wbr>delete 指针名;</wbr></wbr></wbr></span></p> <p><span style="font-size:14px"><wbr><wbr><wbr>例如:</wbr></wbr></wbr></span></p> <p><span style="font-size:14px"><wbr><wbr><wbr><wbr>int *pi = new int(0)</wbr></wbr></wbr></wbr></span></p> <p></p> <p>malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可以用于申请动态内存和释放内存。</p> <p>对于非内部数据类型对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free.</p> </wbr>
本文详细介绍了C语言中malloc、calloc、realloc等内存动态分配函数的使用方法及注意事项,同时对比了C++中使用new、delete进行内存分配与释放的特点。文章还阐述了C++内存管理与C语言的区别,以及如何正确地在C++中管理非内部数据类型对象的内存。

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



