malloc于new的区别

来源:互联网 发布:php截断字符串 编辑:程序博客网 时间:2024/04/29 09:58

  malloc和free是c/c++语言的标准库函数,new/delete是c++的运算符。

 对于malloc:我们必须计算字节数:如 int *p;p=(int *)malloc(32*sizeof(int)),并且返回后强行转换为实际类型的指针;用malloc申请内存空间后,必须检查是否分配成功;malloc与free两个函数应该是配对出现的,使用free释放时只能使用一次,如果释放两次以上可能会出现错误(空指针例外)。

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

对于new:new与delete是操作符,和‘+’,‘-’一样。用于动态创建和释放数组或者单个对象。

动态创建时,不必为其命名,new表达式返回为该对象新创建的指针,我们可以通过指针访问该对象。

如  int *p=new int;

new运算符还能初始化对象。如int *p=new int(10);

对于类来说,如果不提供显示初始化,会调用类的默认构造函数初始化对象;

new与delete配对出现,对于delete来说,delete释放后,指针所指向的内存被释放了,指针不再有效。此时指针变成了悬垂指针(悬垂指针指向曾经存放对象的内存,但该对象已经不存在了)。悬垂指针往往导致程序错误,而且很难检测出来。所以一旦删除了指针对象,立即将指针置为0.

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

对于非内部数据类型来说,光用malloc与free是无法满足要求的。对象在创建时自动调用构造函数,对象消亡时自动调用析构函数。所以不能构造函数和析构函数的任务强加于malloc/free。

0 0
原创粉丝点击