`
bcyy
  • 浏览: 1824857 次
文章分类
社区版块
存档分类
最新评论

c与c++分别是怎样动态分配和释放内存的,有什么区别?

 
阅读更多

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/C++动态分配与释放内存的区别详细解析

    1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void *malloc(unsigned int num_bytes); 说明:分配长度为num_bytes字节的内存块。如果分配成功则返回指向被分配内存的指针...

    Malloc和new区别

    3 ,因此C++ 语言需要一个能完成动态内存分配和初始化工作的运算符new ,以一个能完成清理与释放内存工作的运算符delete.注意ne w/delete 不是库函数。 4 ,C++ 程序经常要调用C函数,而C 程序只能用malloc/free ...

    C/C++自动分配和回收内存

    根据生命周期结束后可以自动释放内存.严格来说是可以说半自动回收,个人原编,希望对大家有用,反正我是用的挺爽,创建内存方面,内存回收也干净.

    计算机操作系统实验_动态分区分配方式模拟

    分别采用首次适应算法、最佳适应算法和最坏适应算法模拟内存空间的动态分配与回收,每次分配和回收后显示出空闲区链的详细情况(说明:在申请不成功时,需要打印当前内存的占用情况信息)。 3.进程对内存空间的申请...

    操作系统模拟内存调用与释放C++代码

    C++代码,模拟实现了操作系统中内存的调用与释放,代码有详细注释,全部实现了最先分配,最优分配,最坏分配三种,代码可以在DEV C++或者VC++ 6.0直接运行,下载不到VC++的可以和我联系,我提供云盘链接。

    用c 语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()

    用c 语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free(),其中,空闲分区通过空闲分区链来管理;在进行内存分配时,系统优先使用空闲区低端的空间。。。。 假设初始状态下,可用...

    操作系统课程设计——一动态分区分配方式的模拟

    要求:用C语言或C++语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间。 假设初始...

    详解C++ 动态内存分配与命名空间

    C语言其实是不支持动态内存分配的,是通过malloc库函数来实现的,可能有一些硬件根本不支持malloc;而C++ new是一个关键字,不管在任意编译器上,任意硬件平台上都是能够进行动态内存分配的,这是本质区别。 malloc...

    C语言 动态内存分配详解

    C语言 动态内存分配详解 动态内存分配涉及到堆栈的概念:堆栈是两种数据结构。堆栈都是数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。 栈(操作系统):由操作系统自动分配释放 ,...

    华为、中兴C.C++笔试面试知识点

    static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 1、extern 存储类别 全局变量的默认方式,当在一个文件中要引用另一个文件中的全局变量或在全局变量定义之前要引用它时,可用extern作...

    C语言内存分布图(计算机基础知识)

    在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。  栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等...

    堆内存是什么呢DOC

     我们知道在c/c++中定义的数组大小必需要事先定义好,他们通常是分配在静态内存空间或者是在栈内存空间内的,但是在实际工作中,我们有时候却需要动态的为数组分配大小,在这里c库中的malloc.h头文件中的malloc()...

    实例代码分析c++动态分配

    1. c语言中动态分配和释放 在c中,申请动态内存是使用malloc和free,这两个函数是c的标准库函数,分配内存使用的是系统调用,使用它们必须包含stdlib.h,才能编译通过。 malloc后需要检查内存是否分配成功,free则...

    C 语言编程常见问题解答.chm

    15.2 C++和C有什么区别? 15.3 在C程序中可以用“∥”作注释符吗? 15.4 char,short,int和long类型分别有多长? 15.5 高位优先(big-endian)与低位优先(little—endian)的计算机有什么区别? 第16章 ANSI/...

    c_c++中内存区域划分大总结

    1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化...

    C语言编程要点

    15.2. C++和C有什么区别? 210 15.3. 在c程序中可以用“∥”作注释吗? 211 15.4. char,short,int和long类型分别有多长? 212 15.5. 高位优先(big—endian)与低位优先(little-endian)的计算机有什么区别? 213 第16章 ...

    高质量C/C++编程指南(PDF)

    7.6 动态内存会被自动释放吗?. 7.7 杜绝“野指针”. 7.8 有了MALLOC/FREE 为什么还要NEW/DELETE ?. 7.9 内存耗尽怎么办?. 7.10 MALLOC/FREE 的使用要点 7.11 NEW/DELETE 的使用要点. 7.12 一些心得体会 第8 章 ...

    高质量C++编程指南.PDF

    7.6 动态内存会被自动释放吗? 7.7 杜绝“野指针” 7.8 有了malloc/free为什么还要new/delete ? 7.9 内存耗尽怎么办? 7.10 malloc/free 的使用要点 7.11 new/delete 的使用要点 7.12 一些心得体会 第8章 C++函数的...

    指针的指针,引用,指针的引用,以及动态内存分配malloc讲解

    静态声明定义变量都是在栈内存中分配空间,在栈空间中会自动释放,而动态分配内存空间是在动态内存空间中开辟的,其中开辟的空间不会自动释放。 这里我还想重申一下数组。 例如在主函数中写到int a[10]; 这里的a...

Global site tag (gtag.js) - Google Analytics