C++ new 和 malloc 的区别?

2024-02-26 1381阅读

温馨提示:这篇文章已超过390天没有更新,请注意相关的内容是否还可用!

 C++ new 和 malloc 的区别?

相关系列文章

C++ new 和 malloc 的区别?

C++内存分配策略​​​​​​​

目录

1.引言

2.区别

2.1.申请的内存分配区域

2.2.类型安全和自动大小计算

2.3.构造函数和析构函数的调用

2.4.异常处理

2.5.配对简便性

2.6.new 的重载

2.7.关键字和操作符

3.总结


1.引言

new 和 delete 在 C++ 中被引入,主要是为了解决 malloc 和 free 在 C 语言中的一些限制和问题,特别是在面向对象编程方面。以下是 new/delete 相比于 malloc/free 的主要区别。

2.区别

2.1.申请的内存分配区域

        new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。

        那么自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。

        特别的,new甚至可以不为对象分配内存!定位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.2.类型安全和自动大小计算

malloc/free 示例:

#include 
struct MyStruct {
    int data;
    // ... 其他成员 ...
};
int main() {
    // 使用 malloc 分配内存,需要手动计算大小
    MyStruct* p = (MyStruct*)malloc(sizeof(MyStruct));
    p->data = 10;
    free(p);
    return 0;
}

new/delete 示例:

struct MyStruct {
    int data;
    // ... 其他成员 ...
};
int main() {
    // 使用 new 分配内存,自动处理大小和类型
    MyStruct* p = new MyStruct;
    p->data = 10;
    delete p;
    return 0;
}

区别:

  • new 自动计算所需内存的大小,而 malloc 需要程序员手动计算。

  • new 提供类型安全,返回正确类型的指针,避免了强制类型转换的需要。

    2.3.构造函数和析构函数的调用

    使用new操作符来分配对象内存时会经历三个步骤:

            1)调用operator new 函数(对于数组是operator new[])分配一块足够大的,原始的,未命名的内存空间以便存储特定类型的对象。

            2)编译器运行相应的构造函数以构造对象,并为其传入初值。

            3)对象构造完成后,返回一个指向该对象的指针。

     使用delete操作符来释放对象内存时会经历两个步骤:

            1)调用对象的析构函数。

            2)编译器调用operator delete(或operator delete[])函数释放内存空间。

            总之来说,new/delete会调用对象的构造函数/析构函数以完成对象的构造/析构。而malloc则不会。下面看个示例:

    class MyClass {
    public:
        MyClass() { std::cout 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]