malloc函数
malloc函数是C语言中stdlib.h头文件下用于申请动态内存的函数,其返回类型是申请的同变量类型的指针,其基本用法如下:
typename *p=(typename*)malloc(sizeof(typename));
以申请一个int型变量和一个结点型node为例:
int *p=(int *)malloc(sizeof(int));
node *p=(node *)malloc(sizeof(node))
这个写法的逻辑是:以需要申请的内存空间大小(即sizeof(node))为malloc函数的参数,这样,malloc函数就会向内存申请一块大小为sizeof(node)型的空间,并且返回指向这块空间的指针。但是此时这个指针是一个未确定类型的指针void *,因此需要把它强制转化为node *型的指针,因此在malloc之前加上node *,这样等号右边就得到了一个node *的指针;如果申请失败,会返回NULL
如果只是申请一个链表结点的话是不会失败的,失败一般是发生在使用malloc申请了较大的动态数组,即
int *p=(int *)malloc(1000000*sizeof(int));
new运算符
new是c++中用来申请动态空间的运算符,其返回类型同样是申请的同变量类型的指针,其基本用法如下:
typename *p=new typename;
以申请一个int型变量和一个结点型node为例:
int *p=new int;
node *p=new node;
可以看到,new的写法比malloc要简洁很多,只需要"new+类型名“即可分配一块该类型的存储空间,并返回一个对应类型的指针,如果申请失败,则会启动C++异常机制处理,而不是返回空指针Null。和malloc同理,如果是使用new申请了较大的数组,即
int *p=new int[1000000];
这时会发生异常,并在没有特殊处理的情况下直接退出程序
内存泄漏
内存泄露是指使用malloc和new开辟出来的内存空间在使用过后没有释放,导致其在程序运行结束之前一直占据该内存。这在一些较大的程序中很容易导致内存消耗过快以致最后没有内存颗分配。C/C++语言的设计者认为,程序员完全有能力自己控制内存的分配与释放,
free函数
free函数是对应malloc函数的,同样是在stdlib.h头文件下,其使用方法非常简单,只需要在free的参数中填写需要释放的内存空间的指针变量(设为p)
free(p)
free函数与malloc函数必须成对出现,否则容易产生内存泄漏
delete运算符
delete(p)
delete运算符与new运算符必须成对出现
另外补充c的free和c++的delete的区别:
delete 用于释放new分配的内存,和new成对调用
free 用于释放malloc分配的内存,和malloc成对调用
使用free释放时需要判断指针是否为NULL,delete不用
free 释放内存,但不调用对象的析构函数
delete 不仅释放内存,还调用对象的析构函数
delete 和new是对对象的操作,是运算符
free 和malloc是对内存空间的操作