当前位置: 首页 > news >正文

malloc、free和new delete的区别

malloc/freenew/delete 是在 C++ 中分配和释放内存的两种不同方法。它们主要有以下区别:

1. 语法和用法

  • mallocfree: malloc开辟空间时需要手动计算分配的空间大小

    int* p = (int*)malloc(sizeof(int) * 10); // 分配10个int类型的内存
    // 使用内存
    free(p); // 释放内存
    

    实际malloc在分配空间的时候会多给我们分配16个字节的空间(存储了内存块的描述信息),即16+mem。然后返回mem的首地址。然后free的时候,会以mem的地址左偏移16位,这样就知道能够释放多大的空间了。

  • newdelete: new开辟空间不需要手动计算分配的大小

    int* p = new int[10]; // 分配10个int类型的内存
    // 使用内存
    delete[] p; // 释放内存
    

2. 类型安全

  • mallocfree: malloc 返回 void*,需要显式转换为所需的类型指针,不提供类型安全。
  • newdelete: new 直接返回所需类型的指针,不需要类型转换,提供类型安全。

3. 构造函数和析构函数

  • mallocfree: 只分配和释放原始内存,不调用构造函数和析构函数。适用于 C 语言风格的内存管理。
  • newdelete: new 在分配内存后调用构造函数,delete 在释放内存前调用析构函数,适用于需要对象初始化和清理的场景。

4. 内存分配失败处理

  • malloc: 内存分配失败时返回 NULL,需要显式检查。
  • new: 内存分配失败时抛出 std::bad_alloc 异常。

5. 自定义操作符

  • newdelete: 可以重载自定义的 newdelete 操作符来实现特定的内存分配行为。

6. 适用范围

  • mallocfree: 主要用于 C 语言,也可以在 C++ 中使用,但不推荐用于需要对象初始化的场景。
  • newdelete: 专为 C++ 设计,推荐用于分配和释放 C++ 对象。

7. 内存分配地址

  • malloc:是在堆上分配的,如果分配的内存小于128k一般是在内存池中取用。如果大于128k则通常会使用 mmap 系统调用直接从操作系统请求内存。mmap 会映射一个匿名内存区域到进程的地址空间,并返回该区域的地址。这种方法的优点是大块内存可以独立管理和释放,不会影响到常规的内存池。

  • new: 是在free sotre上分配内存

    • 调用 operator new 分配内存:operator new 是一个内置的或用户自定义的函数,用于从自由存储区分配足够的内存。
      标准库提供了默认实现的 operator new,通常会调用底层的内存分配函数(如 malloc)来分配内存。
      operator new 可能会抛出 std::bad_alloc 异常,如果内存分配失败。
      调用对象的构造函数:

    • 在成功分配内存后,new 运算符会在分配的内存地址上调用对象的构造函数。
      这一步骤确保对象被正确地初始化。
      返回对象的指针:

    • 构造函数调用完成后,new 运算符返回指向新分配和构造的对象的指针。

示例对比

mallocfree 示例
#include <cstdlib> // 包含 malloc 和 free 的头文件
#include <iostream>struct MyStruct {int x;MyStruct() : x(10) {} // 自定义构造函数
};int main() {MyStruct* p = (MyStruct*)malloc(sizeof(MyStruct)); // 只分配内存,不调用构造函数if (p == nullptr) {std::cerr << "Memory allocation failed\n";return 1;}p->x = 20; // 需要手动初始化std::cout << "MyStruct.x = " << p->x << std::endl;free(p); // 只释放内存,不调用析构函数return 0;
}
newdelete 示例
#include <iostream>struct MyStruct {int x;MyStruct() : x(10) {} // 自定义构造函数~MyStruct() { std::cout << "Destructor called\n"; } // 自定义析构函数
};int main() {MyStruct* p = new MyStruct; // 分配内存并调用构造函数std::cout << "MyStruct.x = " << p->x << std::endl;delete p; // 调用析构函数并释放内存return 0;
}

总结来说,malloc/free 主要用于 C 风格的内存管理,而 new/delete 适用于 C++,因为它们不仅分配和释放内存,还能处理对象的构造和析构。

相关文章:

malloc、free和new delete的区别

malloc/free 和 new/delete 是在 C 中分配和释放内存的两种不同方法。它们主要有以下区别&#xff1a; 1. 语法和用法 malloc 和 free: malloc开辟空间时需要手动计算分配的空间大小 int* p (int*)malloc(sizeof(int) * 10); // 分配10个int类型的内存 // 使用内存 free(p); …...

如何有效地优化 Erlang 程序的内存使用,以应对大规模数据处理的需求?

要有效地优化Erlang程序的内存使用&#xff0c;以应对大规模数据处理的需求&#xff0c;可以考虑以下几个方面&#xff1a; 减少不必要的内存分配&#xff1a;避免过多的数据复制和不必要的数据结构创建。可以使用Erlang的二进制数据类型来避免数据复制&#xff0c;使用原子数据…...

vue3项目使用@antv/g6实现可视化流程功能

文章目录 项目需求一、需要解决的问题二、初步使用1.动态数据-组件封装(解决拖拽会留下痕迹的问题&#xff0c;引用图片&#xff0c;在节点右上角渲染图标&#xff0c;实现&#xff0c;事现旋转动画&#xff0c;达到loading效果)2.文本太长&#xff0c;超出部分显示(...),如下函…...

【Linux网络(一)初识计算机网络】

一、网络发展 1.发展背景 2.发展类型 二、网络协议 1.认识协议 2.协议分层 3.OSI七层模型 4.TCP/IP协议 三、网络传输 1.协议报头 2.局域网内的两台主机通信 3.跨网络的两台主机通信 四、网络地址 1.IP地址 2.MAC地址 一、网络发展 1.发展背景 计算机网络的发展…...

Vulhub——Log4j、solr

文章目录 一、Log4j1.1 Apache Log4j2 lookup JNDI 注入漏洞&#xff08;CVE-2021-44228&#xff09;1.2 Apache Log4j Server 反序列化命令执行漏洞&#xff08;CVE-2017-5645&#xff09; 二、Solr2.1 Apache Solr 远程命令执行漏洞&#xff08;CVE-2017-12629&#xff09;2.…...

linux 设置程序自启动

程序随系统开机自启动的方法有很多种&#xff0c; 这里介绍一种简单且常用的&#xff0c; 通过系统的systemd服务进行自启动。 第一步&#xff1a; 新建一个.service文件 sudo vim /etc/systemd/system/myservice.service[Unit] DescriptionMy Service #Afternetwork.target[…...

PostgreSQL 分区表与并行查询(十)

1. 分区表概述 1.1 什么是分区表 分区表是将大表分割成更小、更可管理的部分的技术。每个分区表都可以单独进行索引和查询&#xff0c;从而提高查询性能和管理效率。 1.2 分区策略 1.2.1 基于范围的分区 按照时间范围或者数值范围进行分区&#xff0c;如按月或按地区。 C…...

React Hooks使用规则:为什么不在条件语句和循环中使用它们

React Hooks为函数组件引入了状态和生命周期特性&#xff0c;极大地增强了其功能。然而&#xff0c;正确使用Hooks是确保组件稳定性和性能的关键。本文将探讨React Hooks的基本规则&#xff0c;以及为什么我们不应该在条件语句和循环中使用它们。 Hooks的基本规则 React团队为…...

【Docker】Consul 和API

目录 一、Consul 1. 拉取镜像 2. 启动第一个consul服务&#xff1a;consul1 3. 查看consul service1 的ip地址 4. 启动第二个consul服务&#xff1a;consul2&#xff0c; 并加入consul1&#xff08;使用join命令&#xff09; 5. 启动第三个consul服务&#xff1a;consul3&…...

Python polars学习-07 缺失值

背景 polars学习系列文章&#xff0c;第7篇 缺失值 该系列文章会分享到github&#xff0c;大家可以去下载jupyter文件&#xff0c;进行参考学习 仓库地址&#xff1a;https://github.com/DataShare-duo/polars_learn 小编运行环境 import sysprint(python 版本&#xff1a;…...

前端面试题(八)答案版

面试形式&#xff1a;线下面试&#xff1a;一面&#xff1a;30分钟二面&#xff1a;30分钟 特殊要求&#xff1a;内网开发自研UI组件库&#xff08;无文档介绍&#xff09;学习能力要求高 面试评价&#xff1a;题目灵活应用性较强 面试官&#xff1a;项目负责人前端负责人 …...

在交易中出场比入场更为重要

出场策略和交易退出机制比交易者入场的方式更为关键&#xff0c;它们对整体回报和结果的持续性有着更大的影响。 即使交易者入场时的条件并非最佳&#xff0c;良好的出场策略也能扭转局势。反之&#xff0c;即使交易者以近乎完美的条件入场&#xff0c;若出场策略管理不当&…...

【D3.js in Action 3 精译】关于本书

文章目录 本书读者本书结构与路线图本书代码liveBook 在线论坛 D3.js 项目的传统开发步骤 本书读者 这本书适用于所有渴望在数据可视化工作中获得完全创意自由的人&#xff0c;从定制化的经典图表到创建独特的数据可视化布局&#xff0c;涵盖内容广泛&#xff0c;应有尽有。您…...

【408考点之数据结构】二叉树的概念与实现

二叉树的概念与实现 一、二叉树的概念 二叉树是一种特殊的树结构&#xff0c;其中每个节点最多有两个子节点&#xff0c;分别称为左子节点和右子节点。二叉树广泛应用于许多计算机科学领域&#xff0c;如表达式解析、排序、搜索算法等。 二、二叉树的性质 性质1&#xff1a…...

STM32之二:时钟树

目录 1. 时钟 2. STM3时钟源&#xff08;哪些可以作为时钟信号&#xff09; 2.1 HSE时钟 2.1.1 高速外部时钟信号&#xff08;HSE&#xff09;来源 2.1.2 HSE外部晶体电路配置 2.2 HSI时钟 2.3 PLL时钟 2.4 LSE时钟 2.5 LSI时钟 3. STM32时钟&#xff08;哪些系统使用时…...

第十四站:Java玫瑰金——移动开发(第二篇)

处理不同类型的网络连接和增强错误处理及用户反馈&#xff0c;需要我们对网络状态检查逻辑进行扩展&#xff0c;并在UI上给予用户适当的提示。以下是对Java代码的进一步扩充&#xff1a; 网络状态检查扩展&#xff1a;区分Wi-Fi和移动数据&#xff0c;并根据网络类型提供不同的…...

数据处理技术影响皮质-皮质间诱发电位的量化

摘要 皮质-皮质间诱发电位(CCEPs)是探究颅内人体电生理学中有效连接性的常用工具。与所有人体电生理学数据一样&#xff0c;CCEP数据极易受到噪声的影响。为了解决噪声问题&#xff0c;通常会对CCEP数据进行滤波和重参考&#xff0c;但不同的研究会采用不同的处理策略。本研究…...

ResultSet的作用和类型

ResultSet的作用&#xff1a; ResultSet在Java中主要用于处理和操作数据库查询结果。它是一个接口&#xff0c;提供了一系列方法来访问和操作数据库查询得到的结果集。具体来说&#xff0c;ResultSet的作用包括&#xff1a; 获取查询结果&#xff1a;通过ResultSet可以获取数…...

计算机网络:运输层 - TCP首部格式 连接的创建与释放

计算机网络&#xff1a;运输层 - TCP首部格式 & 连接的创建与释放 TCP首部格式源端口 目的端口序号确认号数据偏移保留控制位窗口检验和紧急指针 TCP连接创建 - 三次握手TCP传输过程TCP连接释放 - 四次挥手 TCP首部格式 TCP的首部如下&#xff1a; 首部的前20 byte是固定的…...

妈耶!被夸爆的零售数据分析方案在这里

在竞争激烈的零售市场中&#xff0c;数据分析已成为企业决胜的关键。今天&#xff0c;就为大家揭秘一份备受赞誉的零售数据分析方案——奥威BI零售数据分析方案&#xff0c;它围绕“人、货、场、供、财”五大主题&#xff0c;助力企业精准决策&#xff0c;实现业务增长。 一、人…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...