关于c语言与c++中的内存申请

    最近接触了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()套件就差,都有自己独特的优势。

参考文献:

1、malloc函数详解

2、malloc与new函数详解(百度文库)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值