【C++】malloc 和 new 的区别:C++ 动态内存分配全解析

news2024/11/27 23:30:08

在 C++ 中,malloc 是 C 语言中用于动态分配内存的函数,但在 C++ 中,通常用 newdelete 来替代 mallocfree,因为 newdelete 具有更多的功能,比如调用构造函数和析构函数。


C++ 中的 newmalloc 对比

1. mallocfree

  • 定义malloc 是 C 语言中的函数,定义在 <stdlib.h> 中,用于动态分配指定字节数的内存,返回 void* 指针。
  • 特点
    • 需要手动指定分配的字节数。
    • 返回的是 void* 类型,需要显式地进行类型转换。
    • 只分配内存,不会调用类的构造函数。
    • 使用 free 来释放分配的内存。
#include <cstdlib> // 包含 malloc 和 free
#include <iostream>
using namespace std;

int main() {
    // 动态分配内存 (分配一个 int 的大小)
    int* ptr = (int*)malloc(sizeof(int)); // 返回 void*,需要类型转换
    if (!ptr) {
        cout << "Memory allocation failed" << endl;
        return 1;
    }
    *ptr = 42; // 使用分配的内存
    cout << *ptr << endl;

    // 释放内存
    free(ptr);
    return 0;
}

2. newdelete

  • 定义new 是 C++ 中的运算符,用于动态分配内存。
  • 特点
    • 自动确定分配的大小,无需手动指定。
    • 返回的指针已经是正确的类型,不需要显式类型转换。
    • 分配类对象时,会自动调用类的构造函数。
    • 使用 delete 来释放内存,同时调用析构函数。
#include <iostream>
using namespace std;

class MyClass {
public:
    MyClass() { cout << "Constructor called" << endl; }
    ~MyClass() { cout << "Destructor called" << endl; }
};

int main() {
    // 使用 new 分配一个 int
    int* ptr = new int(42); // 分配并初始化为 42
    cout << *ptr << endl;

    // 使用 new 分配一个对象
    MyClass* obj = new MyClass();

    // 释放内存
    delete ptr;
    delete obj;
    return 0;
}

功能对比

特性malloc/freenew/delete
头文件<cstdlib>无需头文件
返回值void*,需强制转换返回正确类型的指针
调用构造/析构函数不调用自动调用
分配大小需要显式指定自动确定
安全性无类型检查类型安全
释放内存方式free()delete

建议

  • 在 C++ 中,应优先使用 newdelete,因为它们更安全并支持对象的构造和析构。
  • 如果代码中需要兼容 C 和 C++,或没有涉及类对象,可以使用 mallocfree

当我们学习数据结构时,经常看到C语言的代码,时常会想如何将其修改为C++的代码,对于malloc/free能否直接转换为new/delete:

在大多数情况下,mallocfree 可以通过 newdelete 替代,但直接替换需要注意:


1. 类型分配的区别

  • malloc 分配内存,但不会调用构造函数,也不会为对象初始化。
  • new 分配内存,同时调用构造函数来初始化对象。

如果你的代码涉及对象的构造或初始化,不能直接用 malloc 换成 new,而应该调整代码来使用 C++ 的初始化方式。

示例:

// 原 C 风格代码
MyClass* obj = (MyClass*)malloc(sizeof(MyClass)); // 仅分配内存,没有调用构造函数

// 改为 C++ 风格
MyClass* obj = new MyClass(); // 分配内存并调用构造函数

2. 释放内存的区别

  • free 释放内存,但不会调用析构函数。
  • delete 释放内存,会调用析构函数来清理资源。

示例:

// 原 C 风格代码
free(obj); // 仅释放内存

// 改为 C++ 风格
delete obj; // 调用析构函数并释放内存

3. 数组的处理

  • 使用 malloc 分配数组,free 释放时只需要调用一次。
  • 使用 new 分配数组,应该用 delete[] 来释放。

示例:

// 原 C 风格代码
int* arr = (int*)malloc(10 * sizeof(int));
free(arr);

// 改为 C++ 风格
int* arr = new int[10];
delete[] arr;

如果使用 delete 代替 delete[] 来释放数组,可能会导致未定义行为。


4. 与构造函数和析构函数的兼容性

  • 如果你的代码需要调用对象的构造函数和析构函数,那么必须使用 newdelete
  • 反之,如果只需要简单分配内存(如用于 POD 类型数据),可以直接用 mallocfree

总结:

  • malloc/free 是 C 风格的内存管理工具,适用于仅分配内存的场景。
  • new/delete 是 C++ 风格的内存管理工具,适合管理复杂对象。
    在替换时,务必考虑对象初始化和资源清理的要求,以免出现内存泄漏或未定义行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2248687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端】JavaScript 中 arguments、类数组与数组的深入解析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是 arguments 对象2.1 arguments 的定义2.2 arguments 的特性2.3 使用场景 &#x1f4af;深入了解 arguments 的结构3.1 arguments 的内部结构arguments 的关键属性…

Kubernetes 还是 SpringCloud?

前些年&#xff0c;随着微服务的概念提出以及落地&#xff0c;不断有很多的公司都加入到了这场技术革新中&#xff0c;现在可谓是人人都在做和说微服务。 提到微服务&#xff0c;Java栈内&#xff0c;就不得不提SpringBoot、SpringCloud、Dubbo。 近几年&#xff0c;随着Cloud …

Redis设计与实现 学习笔记 第二十章 Lua脚本

Redis从2.6版本引入对Lua脚本的支持&#xff0c;通过在服务器中嵌入Lua环境&#xff0c;Redis客户端可以使用Lua脚本&#xff0c;直接在服务器端原子地执行多个Redis命令。 其中EVAL命令可以直接对输入的脚本进行求值&#xff1a; 而使用EVALSHA命令则可以根据脚本的SHA1校验…

C# 调用系统级方法复制、移动和删除等操作界面

有时候需要在程序复制、移动、删除文件等操作&#xff0c;虽然实现的方法有很多&#xff0c;但有些时候真的不如系统自带的界面效果来的直接省事。 好了不啰嗦了&#xff0c;直接看代码。这是网上找的&#xff0c;能用&#xff0c;但是有一点bug&#xff0c;有时候第一次复制文…

AI赋能电商:打造高效销售与卓越用户体验的新引擎

在数字经济迅猛发展的今天&#xff0c;电商行业正处于持续演变的关键时期。技术的进步不仅重塑了电商生态的运行方式&#xff0c;也在深刻改变用户的消费习惯。人工智能&#xff08;AI&#xff09;作为现代科技的核心驱动力&#xff0c;为电商平台提供了前所未有的工具和机遇。…

基于机器视觉的表面缺陷检测

基于机器视觉的表面缺陷检测存在的问题与难点 - AVT相机|AVT红外相机|万兆网相机EVT|VIEWORKS线扫相|映美精相机|Specim多光谱相机|Adimec相机|Basler相机|富士能FUJINON镜头|理光RICOH镜头|OPTO远心镜头|SPO远心镜头|Navtar镜头|VST镜头|CCS光源|3D视觉引导机床上下料系统 (完…

Fakelocation Server服务器/专业版 Windows11

前言:需要Windows11系统 Fakelocation开源文件系统需求 Windows11 | Fakelocation | 任务一 打开 PowerShell&#xff08;以管理员身份&#xff09;命令安装 Chocolatey Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProto…

【Android】View的解析—滑动篇

1.View与ViewGroup View&#xff1a; View是Android中所有UI组件的基类&#xff0c;提供了绘制&#xff08;draw&#xff09;、布局&#xff08;layout&#xff09;和事件处理&#xff08;event handling&#xff09;的基础功能。它是一个抽象类&#xff0c;不能直接实例化&…

极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【三】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

基于混合ABC和A*算法复现

基于混合ABC和A*算法复现 一、背景介绍二、算法原理&#xff08;一&#xff09;A*算法原理&#xff08;二&#xff09;人工蜂群算法原理&#xff08;三&#xff09;混合ABC和A*算法策略 三、代码实现&#xff08;一&#xff09;数据准备&#xff08;二&#xff09;关键函数实现…

linux运行vue编译后的项目

如果你的 Vue 项目使用了 history 模式&#xff08;而非默认的 hash 模式&#xff09;&#xff0c;在纯静态服务器中会出现类似的问题。因为 Vue Router 的 history 模式要求所有未匹配的路径都重定向到 index.html&#xff0c;以便 Vue 前端处理路径。 首先在本地执行npm run…

模拟实现Bash

模拟实现Bash 1.Bash基本认识2.Bash实现3.添加细节4.内置命令5.完整代码 &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列专栏&#xff1a;【Linux的学习】 &#x1f4dd;&#x1f4dd;本篇内容…

sql注入报错分享(mssql+mysql)

mysql mysql的报错内容比较多 网上也有比较多的 这里重复的就不多介绍了。一笔带过 溢出类 bigint 当超过mysql的整形的时候&#xff0c;就会导致溢出&#xff0c;mysql可能会将错误信息带出。这里user()是字母默认为0 取反以后1可能就会导致异常。 报错特征 BIGINT UNSIG…

Hadoop3.3.6集群安装

Hadoop3.3.6 三节点集群安装 准备工作 准备三台机器&#xff0c;大小为4c8g&#xff0c;主节点为 8c16g。并需要保证网络连通性&#xff0c;每台机器都相互ping一下 1、关闭网络防火墙 # 查看网络防火墙状态 sudo systemctl status firewalld # 立即停止 firewalld sudo sy…

如何制作项目网页

一、背景 许多论文里经常会有这样一句话Supplementary material can be found at https://hri-eu.github.io/Lami/&#xff0c;这个就是将论文中的内容或者补充视频放到一个网页上&#xff0c;以更好的展示他们的工作。因此&#xff0c;这里介绍下如何使用前人提供的模板制作我…

JVM调优篇之JVM基础入门AND字节码文件解读

目录 Java程序编译class文件内容常量池附录-访问标识表附录-常量池类型列表 Java程序编译 Java文件通过编译成class文件后&#xff0c;通过JVM虚拟机解释字节码文件转为操作系统执行的二进制码运行。 规范 Java虚拟机有自己的一套规范&#xff0c;遵循这套规范&#xff0c;任…

已存大量数据的mysql库实现主从各种报错----解决方案(看评论)

背景何谓“先死后生”本文使用技术1、实施流程图2、实施2.1、数据库备份2.2、搭建Mysql的Master-Slave2.2.1、准备工作2.2.2、开始部署2.2.3、账号配置2.2.4、slave 同步配置2.2.5、验证 2.3、Master做数据恢复 结语 背景 计划对已有大量数据的mysql库的主从搭建&#xff0c;使…

数据结构 【双向哨兵位循环链表】

链表的结构分为8中&#xff0c;其实搞懂了单链表和双向哨兵位循环链表&#xff0c;这部分的知识也就掌握的差不多了。双向哨兵位循环链表的结构如下&#xff1a; 下面我从0构建一个双向哨兵位循环链表。 1、准备工作 构建节点结构体&#xff0c;双向循环链表的每一个…

高级AI记录笔记(五)

学习位置 B站位置&#xff1a;红豆丨泥 UE AI 教程原作者Youtube位置&#xff1a;https://youtu.be/-t3PbGRazKg?siRVoaBr4476k88gct素材自备 改良近战AI格挡行为 把近战AI的格挡行为从行为树中单独一个任务分块中给删除掉&#xff0c;因为我们希望敌人在受到伤害后立即进行…

彻底解决 macOS 下Matplotlib 中文显示乱码问题

彻底解决 macOS 下Matplotlib 中文显示乱码问题 在使用 Python 的 Matplotlib 库进行数据可视化时&#xff0c;中文字符的显示常常会出现乱码问题&#xff0c;尤其在 macOS 系统上。在网上找了一大堆方法&#xff0c;花了很久&#xff0c;发现不是要安装各种字体就是要改配置&…