malloc函数、free函数和new运算符、delete运算符

来源:互联网 发布:淘宝抠图兼职怎么找 编辑:程序博客网 时间:2024/05/18 17:44

1. C语言malloc函数和free函数

(1)malloc

原型:extern void *malloc(unsigned int num_bytes);

头文件:#include <malloc.h>或#include <alloc.h> (注意:alloc.h与malloc.h的内容是完全一致的)。

功能:分配长度为num_bytes字节的内存块。

说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。返回类型是void*类型。void*表示未确定类型的指针。C、C++规定,void*类型可以强制转换为任何其它类型的指针。

使用示例:char *p;p = (char *)malloc(100);。在结构体中的使用,假设单链表结点结构体Node及指向Node结构体的指针类型typedef struct Node *LinkList;,则LinkList s; s = (LinkList)malloc(sizeof(Node));申请存储空间来生成新的节点。其中(LingList)部分是将malloc函数返回的void*类型强制转换为我们所需要的指针类型。

(2)free

功能: 与malloc()函数配对使用,释放malloc函数申请的动态内存。对于free(p);这句语句,如果p是NULL指针,那么free对p无论操作多少次都不会出问题。如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。

用法: void free(void *ptr);。

2. C++的new和delete运算符

在对动态链表中的结点进行插入和删除操作时,需要对内存空间进行申请分配和释放撤销。在C语言中,通过malloc和free函数来实现以上功能。C++中提供了简便而功能更强大的运算符new和delete来取代malloc和free函数。

(1)运算符new的使用格式:

格式1:指针变量名=new类型标识符;

格式2:指针变量名=new类型标识符(初始值);

格式3:指针变量名=new类型标识符[内存单元个数];

注意:使用new运算符时必须已知数据类型,new运算符会向系统堆区申请足够的存储空间,如果申请成功,就返回该内存块的首地址,如果申请不成功,则返回空指针NULL,用户可以根据该指针判断分配空间操作成功与否。

示例:int *p = new int(100);  //开辟一个存放整型变量的存储空间并指定其初始值为100,返回一个指向该存储空间的地址(即指针p),动态创建的对象本身没有标识符名

如果要撤销上面开辟的空间,delete运算符的使用格式为delete 指针变量;,delete p;即可完成空间释放。空间释放后,指针变量p并没有撤销,该指针所占用的内存空间并未释放,p变为空指针。

(2)开辟数组空间

使用格式:

new 类型名[下标表达式];  //下标表达式可能为一维[n]、二维[m][n]或者更高维

delete [ ] 指向该数组的指针变量名;  // []切记不要忘记

示例:char *pt =new char[10];开辟了包含10个元素的字符数组空间并返回字符数组首元素地址赋给指针变量pt,撤销该空间时,语句delete []pt;即可完成,指针变量前的一对方括号表示是对数组空间的操作。

(3)开辟结构体变量空间

假设已经声明了一个结构体变量Student,语句Student *p; p =new Student; delete p;实现了结构体变量内存空间的申请和撤销。

运算符new开辟内存空间时,系统会根据Student自动算出,不必用户指定。虽然其中并未定义结构体类型Student的变量,在释放内存空间之前都可以使用指针变量p来访问该空间,完成该内存空间的的赋值或读取输出操作。可以将这种操作认为是对一个无名的结构体变量进行操作。

3. malloc与new的不同点

new返回指定类型的地址,并可以自动计算所需内存空间的大小。而malloc需要手动计算字节数并在返回后强制转换指针类型。

阅读全文
1 0