当前位置: 首页> 房产> 建材 > C++_malloc、new,free、delete的差异

C++_malloc、new,free、delete的差异

时间:2025/7/11 23:50:12来源:https://blog.csdn.net/qq_39969848/article/details/141391903 浏览次数:0次

1. 申请的内存所在位置

new 操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。

自由存储区是 C++ 基于new操作符的一个抽象概念,凡是通过 new 操作符进行内存申请,该内存即为自由存储区。

而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。

那么自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。

自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。

不过大家可以基本将自由存储区等价于堆区。

特别的,new 甚至可以不为对象分配内存!placement_new的功能可以办到这一点:

new (place_address) type
place_address为一个指针,代表一块内存的地址。当使用上面这种仅以一个地址调用new操作符时,new操作符调用特殊的operator new,也就是下面这个版本:

void * operator new (size_t,void *) //不允许重定义这个版本的operator new
这个operator new不分配任何的内存,它只是简单地返回指针实参,然后 new 表达式负责在place_address指定的地址进行对象的初始化工作。

2. 内存分配失败时返回值

new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL;malloc分配内存失败时返回NULL。

在使用C语言时,我们习惯在malloc分配内存后判断分配是否成功:

int *a = (int *)malloc ( sizeof (int ));
if(NULL == a) {

} else {

}
从 C 语言走入 C++ 阵营的新手可能会把这个习惯带入C++:

int * a = new int();
if(NULL == a) {

} else {

}
实际上这样做一点意义也没有,因为new根本不会返回NULL,而且程序能够执行到if语句已经说明内存分配成功了,如果失败早就抛异常了。

正确的做法应该是使用异常机制:

try {
int *a = new int();
} catch (bad_alloc) {

}

关键字:C++_malloc、new,free、delete的差异

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: