最近接触了c++中的new操作,它的功用与c语言中的malloc()函数有点类似,都是申请内存空间。
但是他们之间到底有什么区别呢?
malloc函数
原型:extern void *malloc(unsigned int num_bytes);
用法:#include <sdlib.h>
功能:分配长度为num_bytes字节的内存块
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。 当内存不再使用时,应使用free()函数将内存块释放。
注:malloc()函数与free()函数是配套使用的,前者负责申请内存空间,后者则负责释放内存空间它们都包含在<stdlib.h>中。
在使用malloc的时候要注意强制转换,因为malloc的返回值是void *,所以要把它转换成我们想要的类型才能把地址赋给相应类型的指针。
new作为c++中的预操作运算符,它又是怎样的呢?
new:
功能:在堆区动态申请内存空间
用法:有三种格式申请内存空间:
int *pi = new int;
//申请一块int型的空间,并将其地址赋值给pi
int *pi = new int(2);
//申请一块int型的空间,并将其地址赋值给pi,同时初始化该内存空间的数据为1
int *pi = new int[1000];
//申请1000块内存空间,并将其首地址赋值给pi
说明:new的free()函数就是delet,不过delete的话,不管是不是NULL指针都可以释放,因为它会检查。
但是千万不能free(NULL)会出大问题的。
dlete pi;
执行完该语句后,p变成了不确定的指针,在很多机器上,尽管p值没有明确定义,但仍然存放了它之前所指对象的地址,然后p所指向的内存已经被释放了,所以p不再有效。此时,该指针变成了悬垂指针(悬垂指针指向曾经存放对象的内存,但该对象已经不存在了)。悬垂指针往往导致程序错误,而且很难检测出来。 一旦删除了指针所指的对象,立即将指针置为0,这样就非常清楚的指明指针不再指向任何对象。
(零值指针:int *ip=0;
)
注:区分0值指针与NULL指针
零值指针,是值是0的指针,可以是任何一种指针类型,可以是通用变体类型void*也可以是char*,int*等等。
空指针,其实空指针只是一种编程概念,就如一个容器可能有空和非空两种基本状态,而在非空时可能里面存储了一个数值是0,因此空指针是人为认为的指针不提供任何地址讯息。
如果是销毁第三种格式申请的内存空间,应该这样写:
delet [] pi;
注:不管如何申请内存空间,只要是从堆申请的内存用完了要还给操作系统,也就是释放,如果不还的话会发生内存泄露。
malloc和new都申请空间,但是new是强类型的分配,会调用对象的构造函数初始化对象,而malloc仅分配内存空间但是不初始化。new和malloc虽然都是申请内存,但申请的位置不同,new的内存从free store分配,而malloc的内存从heap分配(详情请看ISO14882的内存管理部分),free store和heap很相似,都是动态内存,但是位置不同,这就是为什么new出来的内存不能通过free来释放的原因。不过微软编译器并没有很好的执行标准,很有可能把free store和heap混淆了,因此,free有时也可以。
个人感受:从感性的角度直观的来讲,new——delet套件比malloc()——free()套件要聪明一些(也就是容错机制好一些)。不过学了这么久,也知道,虽然东西是好,但并不代表malloc()——free()套件就差,都有自己独特的优势。
参考文献: