malloc/free 和 new/delete 的区别
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 的区别的更多相关文章
- c++ 浅拷贝和深拷贝 指针和引用的区别 malloc(free)和new(delete)的区别 重载重写重定义
4.malloc(free)和new(delete)的区别 malloc()函数: 1.1 malloc的全称是memory allocation,中文叫动态内存分配. 原型:extern void ...
- 百度笔试题:malloc/free与new/delete的区别(转)
百度笔试题:malloc/free与new/delete的区别 相同点:都可以申请动态内存和释放内存. 不同点: (1) 操作对象有所不同: malloc和free是C/C++的标准库函数,new和d ...
- malloc/free与new/delete的区别
相同点:都可用于申请动态内存和释放内存 不同点:(1)操作对象有所不同.malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符.对于非内部数据类的对象而言,光用m ...
- malloc/free和new/delete的区别汇总
一.基本概念 malloc/free 1.函数原型及说明: void* malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回 ...
- malloc/free与new/delete的区别与联系
相同点:(1)都是申请内存,释放内存,free和delete可以释放NULL指针:(2)都必须配对使用,这里的配对使用,可不能理解为一个new/malloc就对应一个delete/free,而是指在作 ...
- 浅谈malloc/free和new/delete 的区别
malloc和new的区别 malloc是库函数,需要包头文件才能成功运行编译:new是操作符(C++中的关键字),需要在C++的环境下使用. malloc既可以在C语言中使用也可以在C++中使用,n ...
- malloc/free和new/delete的区别
转自:http://blog.csdn.net/chance_wang/article/details/1609081 malloc与free是C++/C语言的标准库函数,new/delete是C++ ...
- malloc/free与new/delete的区别(转)
相同点:都可用于申请动态内存和释放内存 不同点:(1)操作对象有所不同.malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符.对于非内部数据类的对象而言,光用m ...
- C++中malloc / free 和 new / delete 的区别?
1.malloc/free 是C++/C语言的标准库函数,New/delete是C++运算符:都是用于申请动态内存和释放内存. 2.new做两件事:分配内存和调用类的构造函数,delete是:调用类的 ...
随机推荐
- P1574: [Usaco2009 Jan]地震损坏Damage
卧槽卧槽卧槽,这道水题竟然让我WA了两遍!!评测系统卡了然后手贱又提交了一次,然后就悲催了呜呜.. 把与不能回家但牛棚完好的牛相邻的牛棚赋值为不能走(false),可以证明,如果该牛回不了家,则周围一 ...
- mvc5引用ExtJS6
mvc5引用ExtJS6 摘要:VisualStuio2015 asp.net mvc如何引用ExtJS6,使用BundleConfig. 首先下载ExtJS6.0 gpl版.ExtJS有自己的程序框 ...
- Android -- NDK开发入门
第一步,建立一个普通的Android项目HelloNDK,然后在与src同一级的目录下新建一个jni目录: 第二步,在jni目录下新建一个hello_ndk.c文件,代码如下: #include &l ...
- [原创] JavaScript 图片放大镜插件 enlarge.js 以及移动版 enlarge.touch.js
拖拖拉拉准本了一个月,终于把网站做好了.也终于可以分享这两个插件了.这两个插件,一个是 jQuery 版本,适合鼠标使用的,另一个是原生 JavaScript 制作,适合触摸屏使用(touch 事件) ...
- Windows下查看8080进程及结束进程命令
Windows下查看进程及结束进程命令 1)查看占用8080端口的进程号 >netstat –aon | findstr “8080” 结果:TCP 0.0.0.0:8080 ...
- android 开发 对图片编码,并生成gif图片
demo场景: 将2张静态的png格式图片组合生成一个gif图片,间隔500毫秒,关键类:AnimatedGifEncoder 如需要解析gif获取每帧的图片,可参考上一篇博客:<android ...
- 6、android 普通日志输出到SD卡
这是本人见过写博文最负责的一个人: http://www.crifan.com/android_try_use_android_logging_log4j_to_output_log_to_sd_ca ...
- VIMTUTOR《VIM教程》
=============================================================================== = 欢 迎 阅 ...
- hdu 5120 Intersection
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5120 A ring is a 2-D figure bounded by two circles sh ...
- 【BZOJ】【1911】【APIO2010】特别行动队commando
DP/斜率优化 嗯……第三道斜率优化的题目了. 定义 $s[i]=\sum_{k=1}^{i} x[k] $ 方程:$f[i]=max\{ f[j]+a*(s[i]-s[j])^2+b*(s[i]-s ...