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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Matlab实现录音与播放功能

    使用Matlab实现录音与播放功能

    这篇文章主要为大家详细介绍了如何使用Matlab实现录音与播放功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • C++中的set有序且唯一的集合方式

    C++中的set有序且唯一的集合方式

    这篇文章主要介绍了C++中的set有序且唯一的集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • C++中的位运算和位图bitmap解析

    C++中的位运算和位图bitmap解析

    这篇文章主要介绍了C++中的位运算和位图bitmap,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C++函数重载的细节图文详解

    C++函数重载的细节图文详解

    函数重载即函数名相同,函数形参列表不同(函数特征标不同)的一类函数称为函数重载,下面这篇文章主要给大家介绍了关于C++函数重载的相关资料,需要的朋友可以参考下
    2022-12-12
  • 用VScode编写C++大型项目的方法步骤

    用VScode编写C++大型项目的方法步骤

    本文主要介绍了用VScode编写C++大型项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 深入理解c++指针的指针和指针的引用

    深入理解c++指针的指针和指针的引用

    下面小编就为大家带来一篇深入理解c++指针的指针和指针的引用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考,一起跟随小编过来看看吧
    2016-06-06
  • C++日期类的实现日期计算器举例详解

    C++日期类的实现日期计算器举例详解

    这篇文章主要给大家介绍了关于C++日期类实现日期计算器的相关资料,我们要考虑日期的增加和减少,自增和自减,以及两个日期类的比较,以及当前日期类的日期显示和用户的输入输出,需要的朋友可以参考下
    2024-05-05
  • c# 实现获取汉字十六进制Unicode编码字符串的实例

    c# 实现获取汉字十六进制Unicode编码字符串的实例

    下面小编就为大家带来一篇c# 实现获取汉字十六进制Unicode编码字符串的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 在C++中实现高效的数组原地轮转的方法总结

    在C++中实现高效的数组原地轮转的方法总结

    在 C++ 中,可以通过多种方式实现数组的轮转操作,以下是几种常见的实现方法及其对应的代码示例,文中通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2025-04-04
  • 创建二叉树 二叉树如何删除节点操作教程

    创建二叉树 二叉树如何删除节点操作教程

    本文将详细介绍二叉树的创建,节点删除,节点增加等一系列操作方法,需要的朋友可以参考下
    2012-12-12

最新评论