1、malloc在C和C++中的区别

1.1、C中可以将任意的指针赋值给void*类型的变量。也可以将void*类型的值赋值给通常的指针变量。

-------------------------------------------------------------------------------------------------------
ANSI C 以前的C因为没有void*这样的类型,所以malloc的返回值类型被定义为char*。
char*是不能被赋给指向其他类型的指针变量的。所以必须进行下面这样的类型转换。
char *pch = (char*)malloc(size);
ANSI C中,malloc的返回值类型为void*, void*类型的指针可以不经过强制转化赋值给指向其他类型的指针变量。
因此,像上面的强制转换现在已经不需要了。
char *pch = malloc(size);
建议:在C中,不要对malloc的返回值进行强制类型转换,不写多余的代码。
-------------------------------------------------------------------------------------------------------
1.2、C++中可以将任意的指针赋值给void*类型的变量。但不可以将void*类型的值赋值给通常的指针变量。
所以C++中,必须对malloc的返回值进行强转。

1.3、结论
C中,不必对malloc的返回值进行强转
C++中,必须对malloc的返回值进行强转

2、new/delete 和malloc/free的区别

① malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符;

② 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free,new可以认为是malloc加构造函数的执行。

③ new能够自动计算需要分配的内存大小,不需要明确指定,减少了出错的可能。
④ new不需要进行强制类型转换,能够自动返回正确的指针类型
⑤ new可以对分配的内存进行初始化(指的是 char* p = new char('A');这种情况)
⑥ new和delete可以被重载,程序员可以借此扩展new和delete的功能,建立自定义的存储分配系统,详见http://www.cnblogs.com/LubinLew/p/overload_new_and_delete.html

3、new 和 delete 的用法

① p = new type           //分配内存
② p = new type(value) //分配内存,并将内存初始化为value(value可以是类等)
③ p = new type[n]      //分配有n个元素的数组内存(size = n * sizeof(type))

① delete p                  //释放p指向的类型内存(对应new的①和②)
② delete []p               //释放p指向的数组内存(对应new的③)

4、malloc(0) ?

malloc() allocates size bytes and returns a pointer to the allocated memory.
The memory is not cleared. If size is 0, then malloc() returns either NULL,
or a unique pointer value that can later be successfully passed to free().
如果请求的长度为0,则标准C语言函数返回一个null指针或不能用于访问对象的非null指针。

5、calloc、realloc

头文件 :#include <stdlib.h>

函数原型:void *calloc(size_t nmemb, size_t size);

功 能: 在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。

calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。

函数原型:void *realloc(void *ptr, size_t size);

功 能:

【Linux man page】The realloc() function changes the size of the memory block pointed to by ptr to size bytes.

The contents will be unchanged in the range from the start of the region up to the minimum of the old and new sizes.

If the new size is larger than the old size, the added memory will not be initialized. If ptr is NULL, then the call is equivalent to malloc(size),

for all values of size; if size is equal to zero, and ptr is not NULL, then the call is equivalent to free(ptr). Unless ptr is NULL,

it must have been returned by an earlier call to malloc(), calloc() or realloc(). If the area pointed to was moved, a free(ptr) is done.

realloc() 函数的功能是改变 ptr 所指向内存块大小为size 个字节。

ptr指向的内存区域的开始到old size 和 new size的最小值这个范围内的值不会被改变。

如果新的size大于旧的size,增加的内存区域不会被初始化。如果 ptr 等于NULL, 那么等价于 malloc(size),

如果size 等于零并且ptr不等于NULL,那么等价于 free(ptr)。

除非ptr是NULL,否则ptr肯定是之前调用malloc(), calloc() 或者 realloc()的返回值。

【C90(C++98)】Otherwise, if size is zero, the memory previously allocated at ptr is deallocated as if a call to free was made, and anull pointer is returned.

如果size 等于零,等价于 free(ptr),并且返回一个空指针。

【C99/C11(C++11)】If size is zero, the return value depends on the particular library implementation: it may either be a null pointer or some other location that shall not be dereferenced.

如果size 等于零,返回值是否库的实现来决定的。可能返回NULL,也可能返回一个不应该被间接引用的位置。

6、new 和 delete 的深入了解及其工作机制

http://www.cnblogs.com/hazir/p/new_and_delete.html

---------------------------------------------------------------------------------------------------
参考资料:
<<征服C指针>>
<<C++面向对象程序设计(第二版)>>[P25]
http://www.cnblogs.com/wuyuegb2312/p/3219659.html

http://www.cnblogs.com/hazir/p/new_and_delete.html

malloc/free 和 new/delete 的区别的更多相关文章

  1. c++ 浅拷贝和深拷贝 指针和引用的区别 malloc(free)和new(delete)的区别 重载重写重定义

    4.malloc(free)和new(delete)的区别 malloc()函数: 1.1 malloc的全称是memory allocation,中文叫动态内存分配. 原型:extern void ...

  2. 百度笔试题:malloc/free与new/delete的区别(转)

    百度笔试题:malloc/free与new/delete的区别 相同点:都可以申请动态内存和释放内存. 不同点: (1) 操作对象有所不同: malloc和free是C/C++的标准库函数,new和d ...

  3. malloc/free与new/delete的区别

    相同点:都可用于申请动态内存和释放内存 不同点:(1)操作对象有所不同.malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符.对于非内部数据类的对象而言,光用m ...

  4. malloc/free和new/delete的区别汇总

    一.基本概念 malloc/free 1.函数原型及说明: void* malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回 ...

  5. malloc/free与new/delete的区别与联系

    相同点:(1)都是申请内存,释放内存,free和delete可以释放NULL指针:(2)都必须配对使用,这里的配对使用,可不能理解为一个new/malloc就对应一个delete/free,而是指在作 ...

  6. 浅谈malloc/free和new/delete 的区别

    malloc和new的区别 malloc是库函数,需要包头文件才能成功运行编译:new是操作符(C++中的关键字),需要在C++的环境下使用. malloc既可以在C语言中使用也可以在C++中使用,n ...

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

    转自:http://blog.csdn.net/chance_wang/article/details/1609081 malloc与free是C++/C语言的标准库函数,new/delete是C++ ...

  8. malloc/free与new/delete的区别(转)

    相同点:都可用于申请动态内存和释放内存 不同点:(1)操作对象有所不同.malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符.对于非内部数据类的对象而言,光用m ...

  9. C++中malloc / free 和 new / delete 的区别?

    1.malloc/free 是C++/C语言的标准库函数,New/delete是C++运算符:都是用于申请动态内存和释放内存. 2.new做两件事:分配内存和调用类的构造函数,delete是:调用类的 ...

随机推荐

  1. verilog实现16位五级流水线的CPU带Hazard冲突处理

    verilog实现16位五级流水线的CPU带Hazard冲突处理 该文是基于博主之前一篇博客http://www.cnblogs.com/wsine/p/4292869.html所增加的Hazard处 ...

  2. JAVA类与对象(十)-----抽象类

    在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不能实例化对象之外, ...

  3. java字符串替换函数高效实现

    public static String removeStr(String src, String str) { if (src == null || str == null) return src; ...

  4. js之基本包装类型

    为了便于操作“基本类型值”,JS 提供了 三个 特殊的引用类型:Boolean.Number.String.这些类型和其他引用类型相似,但同时 也具备 与各自基本类型相应的特殊行为. 实际上:每当读取 ...

  5. TF-IDF与余弦相似性的应用(二):找出相似文章

    上一次,我用TF-IDF算法自动提取关键词. 今天,我们再来研究另一个相关的问题.有些时候,除了找到关键词,我们还希望找到与原文章相似的其他文章.比如,"Google新闻"在主新闻 ...

  6. Careercup - Microsoft面试题 - 5684901156225024

    2014-05-10 23:45 题目链接 原题: Arrange the numbers in an array in alternating order. For example if the a ...

  7. 【转】PLSQL developer 连接不上64位Oracle 的解决方法

    PLSQL developer 连接不上64位Oracle 的解决方法 快乐无极 , 2012/06/13 10:10 , 开发文档 , 评论(6) , 阅读(140430) , Via 本站原创 大 ...

  8. 【转载】Oracle实例和Oracle数据库(Oracle体系结构)

    免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:Leshami      原文地址:http://blog.csdn.net/ ...

  9. 在eclipse中配置maven

    http://pansanday.blog.163.com/blog/static/381662802012727103454743/ 从eclipse 3.6开始,eclipse有一个marketp ...

  10. 【bzoj1014】[JSOI2008]火星人prefix

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6031  Solved: 1917[Submit] ...