作者:gnuhpc 
出处:http://www.cnblogs.com/gnuhpc/

前几天一个朋友去面试百度空间的一个职位,被问及这个问题,我听后说了几点,不过感觉还是不透彻,所以上网查阅了一些资料,自己又想了想,总结一下。

  • 动作不同:

    • 在C++中,new一个对象时,程序完成对象的空间的分配的同时,构造函数也被调用,类似,delete一个对象时,对象的空间被释放的同时析构函数也被调用。
    • 在C中,malloc和free 则没有构造函数和析构函数被调用这个动作。当然,在没有特定的构造函数或析构函数时,C++也没有这个动作。
  • 关于重载:
    • 在C++中,对于任何非数组的空间分配,我们可以通过定义函数名相同但参数不同的构造函数完成对构造函数的重载,而对于数组的空间分配,就只能使用默认构造函数了,若你试图去开辟一个没有默认构造函数的数组,Compiler会出错。
    • 在C中,自然是没有重载这个事情了。
  • 返回值不同:
    • 在C中,malloc返回一个void *指针,需要你强制指针类型转换
    • 在C++中,你直接new一个就好。
      • 注意,对于基本类型,这个差别是二者唯一的差别,当然不建议在C++中使用malloc+强制类型转换创建基本数据类型或者对象。
  • 定义不同:
    • new是操作符
    • malloc是函数
  • 异常处理方式不同:
    • new抛出异常
    • malloc返回NULL
  • 分配空间单位不同:
    • new分配单位为对象所占用空间的倍数。
    • malloc为字节

使用提示:

1.delete使用不当会造成内存泄露,下边的这个例子就是只有第一个t被释放掉:

Test* t = new Test[3]; 
delete t;

而下列代码会导致堆崩溃或数据丢失。

Test* t = new Test;
delete[] t; // <-- This is even worse

2.realloc只能用于malloc。C++中你只能重新开辟空间、复制、释放原来空间来完成相同的操作。

3.性能区别,根据http://code.dawnofthegeeks.com/2009/05/04/fyi-new-vs-malloc/ 其中提到malloc/free慢于new/delete,但是在后来笔者开发的一个程序中却出现了不同的场景。

转:http://www.cnblogs.com/gnuhpc/archive/2012/12/10/2811943.html

【转】 C++中的new VS C语言中的malloc的更多相关文章

  1. c语言中的malloc函数

    少壮不努力,大一的时候c语言学得不扎实,最近学数据结构的时候看到c语言中malloc函数都不知道了,这里记录一下,避免以后再忘. malloc的全称是memory allocation,中文叫动态内存 ...

  2. C语言中的malloc和free

    最近在研究php自定义函数的实现,其中php自定义函数在传递参数时,是放到人为的一个栈中,这个跟写C程序时,参数入栈的这个栈还不一样,其中延伸到了 malloc 以及free 有人说在free(p)后 ...

  3. C-C++到底支不支持VLA以及两种语言中const的区别

    C-C++到底支不支持VLA以及两种语言中const的区别 到底支不支持VLA VLA就是variable-length array,也就是变长数组. 最近写程序的时候无意间发现,gcc中竟然支持下面 ...

  4. C++中函数的默认参数和C语言中volatile的学习

    1.函数默认参数 1 int func(int a,int b=10) 2 { 3 return a*b; 4 } 5 6 int main() 7 { 8 int c=func(2); 9 cout ...

  5. C语言中float,double类型,在内存中的结构(存储方式)

    C语言中float,double类型,在内存中的结构(存储方式)从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以doubl ...

  6. Delphi中获取Unix时间戳及注意事项(c语言中time()是按格林威治时间计算的,比北京时间多了8小时)

    uses DateUtils;DateTimeToUnix(Now) 可以转换到unix时间,但是注意的是,它得到的时间比c语言中time()得到的时间大了8*60*60这是因为Now是当前时区的时间 ...

  7. [原创]C/C++语言中,如何在main.c或main.cpp中调用另一个.c文件

    C/C++语言中,如何在main.cpp中调用另一个.c文件主要有5种思路: 1.在VS2012 IDE中,将被引用的.c文件后缀名全部修改为.h,然后通过IDE的解决方案资源管理器中鼠标右键单击“头 ...

  8. C语言中static的作用及C语言中使用静态函数有何好处

    转自:http://www.jb51.net/article/74830.htm 在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0. 在C语言中,static ...

  9. C语言中printf与i++,C++中的cout

    一,printf与i++ 1,C语言中的printf是自右向左输出,. 2,而i++与++i不同的 i++首先取得i的值,下一行时候i = i + 1: ++i,首先i = i + 1,再取得i的值. ...

随机推荐

  1. DBCP连接Oracle,数据库重启后现OALL8 is in an inconsistent state异常

    最近,DBCP连接Oracle,数据库重启后现OALL8 is in an inconsistent state异常. 版本说明 commons-dbcp-1.4.jar commons-pool-1 ...

  2. HDU 5640 King's Cake

    King's Cake Problem Description It is the king's birthday before the military parade . The ministers ...

  3. jQuery 判断页面元素是否存在

    if ( $("#someID").length > 0 ) {  } 根据JavaScript的经验,尝试用$("#someID") != " ...

  4. CentOS 7.0安装配置LAMP服务器(Apache+PHP+MariaDB)

    CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: systemctl stop firewalld.service #停止fir ...

  5. ORACLE分页SQL语句

    .根据ROWID来分 select * from t_xiaoxi where rowid in(select rid from (select rownum rn,rid from(select r ...

  6. Nodejs之socket广播

    nodejs发送udp广播还是蛮简单的,我们先写个服务器用于接收广播数据,代码如下: var dgram = require("dgram"); var server = dgra ...

  7. 面向对象--类库、委托、is和as运算符、泛型集合

    类库: 其实就是一堆类文件,只是看不到这些类的源代码,保密性好. 优点:保密性好 缺点:如果这个方法不好用,使用者无法自己去更改它. 给的大多是dll文件.使用方法:引用右键,添加引用,浏览,选择到相 ...

  8. NPO与X7R、X5R、Y5V、Z5U神马的有啥区别

    主要是介质材料不同.不同介质种类由于它的主要极化类型不一样,其对电场变化的响应速度和极化率亦不一样. 在相同的体积下的容量就不同,随之带来的电容器的介质损耗.容量稳定性等也就不同.介质材料划按容量的温 ...

  9. JAVA GUI设计中遇到的一个小问题

    最近新学,大牛勿喷.. 写下笔记主要是记录自己常犯的错误,也方便新人解决问题学习参考. 问题:win7下设计GUI,文本框和密码框显示不出来. 我的解决方案: 1. JTextField text = ...

  10. getting started with building a ROS simulation platform for Deep Reinforcement Learning

    Apparently, this ongoing work is to make a preparation for futural research on Deep Reinforcement Le ...