`
hao3100590
  • 浏览: 131246 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

c++中malloc与free

阅读更多

 

from:http://hi.baidu.com/hayrek/blog/item/4ed2749a5e8307b2c8eaf4c3.html

 

c++中malloc与free


一、malloc()和free()的基本概念以及基本用法: 


1、函数原型及说明: 


void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。 


关于分配失败的原因,应该有多种,比如说空间不足就是一种。 


void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。 


2、函数的用法: 


其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子: 


程序代码: 

// Code... 

char *Ptr = NULL; 

Ptr = (char *)malloc(100 * sizeof(char)); 

if (NULL == Ptr) 

exit (1); 

gets(Ptr); 


// code... 

free(Ptr); 

Ptr = NULL; 

// code... 

就是这样!当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。 


3、关于函数使用需要注意的一些地方: 


A、申请了内存空间后,必须检查是否分配成功。 


B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。 


C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会 


出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。 


D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一 


些编译器的检查。 


好了!最基础的东西大概这么说!现在进入第二部分: 



二、malloc()到底从哪里得来了内存空间: 


1、malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。就是这样! 


说到这里,不得不另外插入一个小话题,相信大家也知道是什么话题了。什么是堆?说到堆,又忍不住说到了栈!什么是栈?下面就另外开个小部分专门而又简单地说一下这个题外话: 


2、什么是堆:堆是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。 


什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立。每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。 


以上的概念描述是标准的描述,不过有个别语句被我删除,不知道因为这样而变得不标准了^_^. 


通过上面对概念的描述,可以知道: 


栈是由编译器自动分配释放,存放函数的参数值、局部变量的值等。操作方式类似于数据结构中的栈。 


堆一般由程序员分配释放,若不释放,程序结束时可能由OS回收。注意这里说是可能,并非一定。所以我想再强调一次,记得要释放!


**************************************************


malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。 


对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 


因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。 

类Obj的函数Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能。函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作。函数UseNewDelete则简单得多。 


所以我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。 


既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。 


如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。

分享到:
评论

相关推荐

    C++中malloc与free、new与delete的详解与应用

    C++面试经常会问到关于malloc/free和new/delete的区别,网上有不同版本的解释,这里总结下并加上个人理解和使用。 两者相同点 1.都可以申请动态堆内存。 两者不同点 1.new/delete是C++的操作符,malloc/free是C/...

    malloc和free的实现

    本文将详细介绍如何在Visual C++ 2008环境下实现 `malloc` 和 `free` 的功能,并通过注释和图形解释来帮助理解。 #### 二、基本概念 在本实现中,使用了一个大容量的静态数组作为堆区的基础,也可以选择使用操作...

    C++中new和malloc的区别

    在C++中,动态内存分配主要通过new和delete运算符实现,而C语言中主要使用malloc和free函数。尽管这两组工具看似执行相似的功能,但它们之间存在着本质的差异。 相同点 new和malloc都可以用来在堆上分配内存,且都...

    Malloc和new区别

    **Malloc** 与 **Free** 是 C/C++ 语言中的标准库函数,主要用于动态内存的分配与释放。这两个函数定义在 `<cstdlib>`(或 `<malloc.h>`)库中。 **New** 与 **Delete** 是 C++ 语言中的关键字,作为运算符使用,...

    c/c++ mallocfree newdelete 区别

    在C/C++编程中,内存管理是至关重要的一个环节,其中`malloc`和`free`是C语言标准库提供的函数,而`new`和`delete`是C++中的运算符,它们都用于动态内存的分配和释放。虽然两者在功能上有相似之处,但在使用和功能上...

    内存管理中malloc和free的奥秘

    与C++中的new运算符相比,malloc有一些显著的不同。new可以直接根据类型自动计算所需内存大小,并返回指定类型的指针,例如`new int`会分配一个整数大小的内存,而`new int[100]`则会分配100个整数的内存。相反,...

    C++中对使用malloc/new引起的内存泄露的检查

    在C++中,`malloc`和`new`是动态内存分配的主要方式,而`free`和`delete`则用于释放这些内存。本文将详细介绍如何检查和防止由`malloc/new`引起的内存泄漏。 **1. 重载`new`和`delete`** 为了更好地管理和跟踪内存...

    11_new&delete与malloc&free 之间的关系与区别1

    "new与delete和malloc与free之间的关系与区别" 在C++编程语言中,new和delete是C++的关键字,是一种操作符,可以被重载,而malloc和free是C语言的库函数,并且不能重载。这两对函数都是用于内存管理的,但是它们...

    C++ 中malloc()和free()函数的理解

    在C++编程中,`malloc()` 和 `free()` 函数是C语言库的一部分,但在C++中也可以使用,主要用于动态内存管理。它们是C++标准库`<cstdlib>`(或`<stdlib.h>`)的一部分,提供了在程序运行时动态分配和释放内存的能力。...

    malloc 与new的区别

    而C++则通过关键字new和delete来实现这一功能,它们与C语言中的malloc和free既有相似之处也有明显的区别。本文将对malloc和new的区别进行详细解读,包括它们的属性、参数、返回类型、自定义类型处理、内存区域、分配...

    C++中new与delete、malloc与free应用分析

    一般来说,在C/C++的面试时,对于new/delete和malloc/free这两对的使用和区别经常被考查到,如果这种基础的问题都答不上来,估计很难过面试了。本文即是对new/delete和malloc/free这两对的使用和区别较为简单的分析...

    C++中的new VS C语言中的malloc.docx

    【C++中的new与C语言中的malloc对比】 在C++和C语言中,内存管理是程序员必须关注的重要方面。C++引入了`new`运算符和`delete`运算符,而C语言则使用`malloc`函数和`free`函数进行动态内存分配和释放。两者的区别...

    wasm-malloc:用于WebAssembly的mallocfree

    wasm-malloc WebAssembly的malloc / free的简单实现。 堆是一个双链表,如果有必要/可能,将合并或拆分块。 目前,不支持realloc。 malloc / calloc无法正确对齐内存。 由于WebAssembly MVP不支持缩小线性内存,因此...

    c++内存的动态申请与释放.pdf

    本文将详细介绍C++中两种常用的内存动态申请与释放的方式:`malloc/free` 和 `new/delete`。 #### 二、动态内存管理的基本概念 动态内存是指在程序运行过程中根据需要动态分配和释放的内存空间。这种内存空间不...

    深入理解C++中的new/delete和malloc/free动态内存管理及区别介绍

    本篇文章将深入探讨C++中的`new`/`delete`与C语言中的`malloc`/`free`在动态内存管理上的差异,并分析它们的底层实现与执行流程。 首先,`malloc`/`free`是C/C++标准库提供的函数,主要用于动态分配和释放内存。`...

    C++面试概念与程序纠错

    在本节中,我们将讨论C++面试中经常出现的一些概念和问题,包括虚函数、析构函数、malloc与free、delete与new等。 首先,让我们来讨论new、delete、malloc、free之间的关系。new和delete是C++的运算符,用于申请...

Global site tag (gtag.js) - Google Analytics