在C++程序猿面试中。非常easy被问到new 和 malloc的差别。偶尔在quora上逛。看到Robert Love的总结。才发现自己仅仅知道里面的一两项就沾沾自喜,从来没有像这位大牛一样去细致思考这些问题,借着这篇文章细致探讨下这个经典问题。

一、new是操作符。而malloc是函数

void* malloc(size_t);
void free(void*);
void *operator new (size_t);
void operator delete (void *);
void *operator new[] (size_t);
void operator delete[] (void *);

二、new在调用的时候先分配内存,在调用构造函数。释放的时候调用析构函数。

#include <iostream>
using namespace std; class Player{
public:
Player(){
cout << "call Player::ctor\n";
} ~Player(){
cout << "call Player::dtor\n";
} void Log(){
cout << "i am player\n";
} }; int main(){
cout << "Initiate by new\n";
Player* p1 = new Player();
p1->Log();
delete p1; cout << "Initiate by malloc\n";
Player* p2 = (Player*)malloc(sizeof(Player));
p2->Log();
free(p2);
}

输出结果为:

Initiate by new

call Player::ctor

i am player

call Player::dtor

Initiate by malloc

i am player

三、new是类型安全的,malloc返回void*

四、new能够被重载

五、new分配内存更直接和安全

六、malloc 能够被realloc

#include <iostream>
using namespace std; int main(){
char* str = (char*)malloc(sizeof(char*) * 6);
strcpy(str, "hello");
cout << str << endl; str = (char*)realloc(str, sizeof(char*) * 12);
strcat(str, ",world");
cout << str << endl; free(str);
}

输出结果为:

hello

hello,world

七、new错误发生抛出异常。malloc返回null

八、malloc能够分配随意字节,new 仅仅能分配实例所占内存的整数倍数大小

结论:

学习知识的时候假设能把握整个技术的发展历史和脉络,这样对有些比較难懂的知识就非常easy理解了。

将这些技术放在其所存在的年代,考虑到当时的软硬件环境。能够更好的理解技术本身。

这篇文章是非常浅层次的说明了他们的差别。假设有兴趣能够去研究他们的详细实现。能发现更大的乐趣。

C++之new和malloc差别的更多相关文章

  1. malloc()与calloc差别

    Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slig ...

  2. new/malloc的差别

    1. malloc()函数 1.1 malloc的全称是memory allocation.中文叫动态内存分配. 原型:extern void *malloc(unsigned int num_byt ...

  3. malloc和calloc的差别

    做C这么久了,才了解calloc函数也是挺丢人的. 从网上找了非常多关于这两者差别的文章.有的甚至总结了好多人的结论.但我感觉都没有说的非常明确. 当中关于函数原型的差别根本就不是必需再讨论了,是个人 ...

  4. malloc、calloc、realloc三者的差别

    1.malloc 作用:分配内存块 原型:void *malloc(size_t size);size表示要分配的字节数 返回值:返回一个指向所分配空间的void指针,假设没有足够的内存可用,则返回N ...

  5. C++ - new与malloc的差别

    malloc是C++语言的标准库函数:而new是C++语言中的操作符. new返回指定类型的指针,而且能够自己主动计算所需空间的大小:而malloc必需要由用户自己计算所需空间大小,并在返回后强行转换 ...

  6. 【转载】new和malloc的区别

    本篇随笔为转载,原贴地址:C++中new和malloc的十点区别. 前言 几个星期前去面试C++研发的实习岗位,面试官问了个问题: new与malloc有什么区别? 这是个老生常谈的问题.当时我回答n ...

  7. 细说new与malloc的10点区别

    前言 几个星期前去面试C++研发的实习岗位,面试官问了个问题: new与malloc有什么区别? 这是个老生常谈的问题.当时我回答new从自由存储区上分配内存,malloc从堆上分配内存:new/de ...

  8. new/delete和malloc/free的区别

    通俗易懂版本:http://zhidao.baidu.com/question/86185100 1 new/delete和malloc/free最大区别是对对象的理解. 如果你使用 Foo* foo ...

  9. 写给java程序员的c++与java实现的一些重要细微差别

    0.其实常规的逻辑判断结构.工具类.文件读写.控制台读写这些的关系都不大,熟悉之后,这些都是灵活运用的问题. 学习c/c++需要预先知道的一个前提就是,虽然有ANSI C标准,但是每个c/c++编译器 ...

随机推荐

  1. 360浏览器 收藏夹 ico 缓存 目录

    C:\Users\Administrator\AppData\Roaming\360se6\apps\data\users\default\data\ico

  2. 梦想CAD控件,用于浏览和编辑DWG文件,在脱离AUTOCAD的情况下独立运行,相当于简易CAD

    (百度百科连接) 梦想绘图控件5.2  是国内最强,最专业的CAD开发组件(控件),不需要AutoCAD就能独立运行.控件使用VC 2010开发,最早从2007年第一个版本完成,经过多年的累积已经非常 ...

  3. IIS HTTP 错误 401.3的解决办法

    目标网站添加新用户Everyone,选上需要的Everyone用户权限

  4. ubuntulinux 更改时区设置时间

    Linux/shell命令的实际应用——查看并修改系统时区 命令: www.2cto.com date -R //查询当前系统时间与默认时区 cp /usr/share/zoneinfo/Asia/S ...

  5. JS_类数组

    [目录] 什么是数组 非类数组 类数组对象转化为数组 [类数组] 什么是类数组? 定义: 不具有数组的所具有的方法 拥有length属性,其属性(索引)为非负整数 类数组 var obj = { 0 ...

  6. JFinal怎么更改项目服务的端口

    如图所示,运行时启动的端口是80,现在将它改成801: 可以在Debug configuration 或 Run configuration 弹出的窗口中配置,方法右击项目>properties ...

  7. java上传文件大小转换(字节转kb/mb/gb)

    /** * 字节转kb/mb/gb * @param size * @return */ public String getPrintSize(long size) { //如果字节数少于1024,则 ...

  8. JS 水印图片合成实例页面

    CSS代码: .clip { position: absolute; clip: rect(0 0 0 0); } HTML代码: <input type="file" id ...

  9. canvas学习--准备

    一)canvas标签 属性: 1.width 和 height 控制canvas宽高: 2.style添加基本样式 3.class,id属性 4.标签内添加一行文本,主要用于浏览器不支持canvas标 ...

  10. 树莓派 - 通过sysfs操控GPIO

    点亮或熄灭LED 硬件上,一个LED灯接在pi的Pin-25.  该引脚为BCM的GPIO26 $ gpio readall +-----+-----+---------+------+---+--- ...