new/delete 与 malloc/free 的区别是什么?
2015-07-02 08:28
197 查看
先上区别:
1. new/delete是C++里才有的,而new/delete与malloc/free一个显著的区别在于,new是建造一个对象,并调用对象的构造函数来初始化对象,其实在所有的new操作过程中,总是分为两步的:第一步是申请内存,第二步则是调用构造函数初始化对象。同样,在调用delete的时候,需要先调用析构函数,然后在销毁堆内存。
2. new/delete通常来说是操作符,就是"+","-"一样,而malloc/free是库函数。
3. new/delete是可以重载的,而重载之后,就成为了函数。
4. malloc在申请内存的时候,必须要提供申请的长度,而返回的指针是void*型,必须要强转才能成为需要的类型。
5. 当new/delete在类中被重载的时候,可以自定义申请过程,比如记录所申请内存的总长度,以及跟踪每个对象的指针。
6. C++默认的new/delete操作符内部,其实也调用了malloc/free这两个函数。
共同点:
1. 都必须配对使用,这里的配对使用,可不能理解为一个new/malloc就对应一个delete/free,而是指在作用域内,new/malloc所申请的内存,必须被有效释放,否则将会导致内存泄露。
2. 都是申请内存,释放内存,free和delete可以释放NULL指针。
注意点:
1. new/delete与malloc/free不能混合使用,有些人对这个观点持怀疑态度,因为在很多时候,他混合使用之后也没有严重的后遗症,那是因为在通常情况下,new操作符的确调用了malloc这个函数,所以free函数可以正常的释放new出来的内存空间。但这并不能保证所有的new操作符都是调用C++的new的原始操作符,而最常见的是,在类中,我们是可以重载new这个操作符的,这样的话,如果一但在operator=new()函数中调用了其它的申请函数的话东西,free将无法正常工作,或者说也将导致内存泄露。
内容来自CSDN博客
jerry4711的专栏 (如有侵权,删!)
1. new/delete是C++里才有的,而new/delete与malloc/free一个显著的区别在于,new是建造一个对象,并调用对象的构造函数来初始化对象,其实在所有的new操作过程中,总是分为两步的:第一步是申请内存,第二步则是调用构造函数初始化对象。同样,在调用delete的时候,需要先调用析构函数,然后在销毁堆内存。
2. new/delete通常来说是操作符,就是"+","-"一样,而malloc/free是库函数。
3. new/delete是可以重载的,而重载之后,就成为了函数。
4. malloc在申请内存的时候,必须要提供申请的长度,而返回的指针是void*型,必须要强转才能成为需要的类型。
5. 当new/delete在类中被重载的时候,可以自定义申请过程,比如记录所申请内存的总长度,以及跟踪每个对象的指针。
6. C++默认的new/delete操作符内部,其实也调用了malloc/free这两个函数。
共同点:
1. 都必须配对使用,这里的配对使用,可不能理解为一个new/malloc就对应一个delete/free,而是指在作用域内,new/malloc所申请的内存,必须被有效释放,否则将会导致内存泄露。
2. 都是申请内存,释放内存,free和delete可以释放NULL指针。
注意点:
1. new/delete与malloc/free不能混合使用,有些人对这个观点持怀疑态度,因为在很多时候,他混合使用之后也没有严重的后遗症,那是因为在通常情况下,new操作符的确调用了malloc这个函数,所以free函数可以正常的释放new出来的内存空间。但这并不能保证所有的new操作符都是调用C++的new的原始操作符,而最常见的是,在类中,我们是可以重载new这个操作符的,这样的话,如果一但在operator=new()函数中调用了其它的申请函数的话东西,free将无法正常工作,或者说也将导致内存泄露。
内容来自CSDN博客
jerry4711的专栏 (如有侵权,删!)
相关文章推荐
- Mac下安装OpenCV3.0和Anaconda
- html里显示中文乱码的解决办法
- html里显示中文乱码的解决办法
- 大型项目使用Automake/Autoconf完成编译配置
- golang example Hello World
- Linux中>、>>、<、<<重定向及管道命令
- php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法
- 查看网络图片
- VisualStudio 怎么使用Visual Leak Detector
- java读取.properties文件
- 开源 java CMS - FreeCMS2.3会员密码设置
- Climbing Stairs
- 关于精益创业理念随想
- apache在ubuntu的配置(apt-get 安装)
- Android学习 20 -> 进度条之加载进度条ProgressBar
- PHP概率算法(适用于抽奖、随机广告)
- HADOOP namenode HA
- SPI
- linux内核驱动模块编写ioctl
- 浮点数取整运算