C++中new/delete与malloc/free的区别小结

 更新时间:2023年08月29日 10:38:50   作者:Arman_  
本文主要介绍了C++中new/delete与malloc/free的区别小结, malloc、free是C中的库函数 new、delete 是C++当中的操作符,读者可以更好地理解C++中内存管理的方式和优势

分配内存的位置

  • malloc是从上动态分配内存
  • new是从自由存储区为对象动态分配内存。自由存储区的位置取决于operator new的实现。自由存储区不仅可以为堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存

是否可以被重载

  • opeartor new 、operator delete 可以被重载
  • malloc、free则不能重载

内存分配

  • malloc内存分配成功后返回void*,然后再强制类型转换为需要的类型
    • malloc内存分配失败后返回 NULL
  • new操作符分配内存成功后返回与对象类型相匹配的指针类型;因此new是符合类型安全的操作符
    • new分配内存失败则会抛异常 std::bad_alloc
    • 如果加上std::nothrow关键字`,UserInfo* info = new (std::nothrow) UserInfo; // new 就不会抛出异常而是会返回空指针

分配内存的大小的计算

  • 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算
  • malloc则需要显式地指出所需内存的尺寸

使用场景

  • new/delete 适用于C++对象,它们会自动处理对象的构造和析构。
  • malloc/free 更通用,可以在C++中使用,也可以在C中使用,但需要手动管理对象的构造和析构。
// 使用 malloc 分配内存 并 强制类型转换
UserInfo* user = static_cast<UserInfo*>(malloc(sizeof(UserInfo)));
// 构造对象
new (user) UserInfo("Alice", 25);
// 使用对象指针调用成员函数
std::cout << "User's age: " << user->getAge() << std::endl;
// 手动调用析构函数
user->~UserInfo();
// 释放内存
free(user);

到此这篇关于C++中new/delete与malloc/free的区别小结的文章就介绍到这了,更多相关C++ new/delete与malloc/free内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于C++中strcpy函数例题讲解

    关于C++中strcpy函数例题讲解

    在本篇文章里小编给大家整理的是关于C++中strcpy函数例题讲解内容,需要的朋友们可以参考下。
    2020-05-05
  • 详谈c++11 final与override说明符

    详谈c++11 final与override说明符

    下面小编就为大家带来一篇详谈c++11 final与override说明符。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Qt读写ini文件之QSettings用法

    Qt读写ini文件之QSettings用法

    这篇文章主要为大家介绍了Qt读写ini文件之QSettings的使用方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C语言字符串函数操作(strlen,strcpy,strcat,strcmp)详解

    C语言字符串函数操作(strlen,strcpy,strcat,strcmp)详解

    大家好,本篇文章主要讲的是C语言字符串函数操作(strlen,strcpy,strcat,strcmp)详解,感兴趣的同学赶快来看一看吧
    2021-12-12
  • C语言的三种条件判断语句你都了解吗

    C语言的三种条件判断语句你都了解吗

    这篇文章主要为大家详细介绍了C语言的三种条件判断语句,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C语言+MySQL实现推箱子游戏

    C语言+MySQL实现推箱子游戏

    经典的推箱子是一个来自日本的古老游戏,目的是在训练你的逻辑思考能力。本文将通过C语言和MySQL实现推箱子这一经典游戏,感兴趣的可以了解一下
    2022-02-02
  • c语言main函数使用及其参数介绍

    c语言main函数使用及其参数介绍

    这篇文章主要介绍了c语言main函数使用及其参数介绍,需要的朋友可以参考下
    2014-04-04
  • 基于Matlab实现中国象棋的示例代码

    基于Matlab实现中国象棋的示例代码

    中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史。由于用具简单,趣味性强,成为流行极为广泛的棋艺活动。本文将利用Matlab实现这一游戏,需要的可以参考一下
    2022-02-02
  • Swift编程中的泛型解析

    Swift编程中的泛型解析

    这篇文章主要介绍了Swift编程中的泛型解析,是Swift入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • C语言冒泡排序算实现代码

    C语言冒泡排序算实现代码

    本文主要介绍C语言冒泡排序算法,这里给大家举例说明冒泡排序的思想,并附有代码示例,有需要的小伙伴可以参考下
    2016-07-07

最新评论