C++ 内存管理:深入理解 new、malloc、delete 和 free
引言
在 C++ 中,内存管理是一个非常重要的主题。正确使用动态内存分配和释放工具(如 new、malloc、delete 和 free)可以避免内存泄漏和程序崩溃。本文将深入探讨这些工具的区别,并介绍池化计数技术。
1. new 与 malloc 在动态申请内置类型与自定义类型的区别
1.1 内置类型
new:
new是 C++ 的关键字,用于动态分配内存并返回指向该内存的指针。- 对于内置类型(如
int、double),new会调用构造函数(如果有)并初始化内存。 - 示例:
int* p = new int(10); // 分配内存并初始化为 10
malloc:
malloc是 C 标准库函数,用于分配指定大小的内存块。- 对于内置类型,
malloc只分配内存,不会初始化。 - 示例:
int* p = (int*)malloc(sizeof(int)); // 分配内存,未初始化
1.2 自定义类型
new:
- 对于自定义类型(如类或结构体),
new不仅分配内存,还会调用构造函数。 - 示例:
class MyClass {
public:MyClass() { std::cout << "Constructor called!" << std::endl; }
};
MyClass* obj = new MyClass(); // 分配内存并调用构造函数
malloc:
malloc只分配内存,不会调用构造函数。- 示例:
MyClass* obj = (MyClass*)malloc(sizeof(MyClass)); // 分配内存,未调用构造函数
2. 池化
2.1 什么是池化?
池化计数(Pooling)是一种内存管理技术,通过预先分配一大块内存(内存池),然后在需要时从池中分配小块内存,减少频繁调用系统内存分配函数的开销。
2.2 池化的优点
- 性能提升:减少内存分配和释放的开销。
- 内存碎片减少:通过集中管理内存,减少内存碎片。
- 适用于高频内存操作场景:如游戏开发、网络服务器等。
class MemoryPool {
public:MemoryPool(size_t blockSize, size_t blockCount) {pool = malloc(blockSize * blockCount); // 预分配内存池}void* allocate(size_t size) {// 从内存池中分配内存void* ptr = /* 从池中分配的逻辑 */;return ptr;}void deallocate(void* ptr) {// 将内存归还到池中}~MemoryPool() {free(pool); // 释放内存池}private:void* pool;
};
3. new 与 malloc 的区别,delete 与 free 的区别
3.1 new 与 malloc 的区别
| 特性 | new | malloc |
|---|---|---|
| 语言 | C++ 关键字 | C 标准库函数 |
| 内存分配 | 分配内存并调用构造函数 | 只分配内存,不调用构造函数 |
| 返回值 | 返回具体类型指针 | 返回 void*,需要强制类型转换 |
| 失败处理 | 抛出 std::bad_alloc 异常 | 返回 NULL |
| 内存大小 | 自动计算所需内存大小 | 需要手动计算内存大小 |
3.2 delete 与 free 的区别
| 特性 | delete | free |
|---|---|---|
| 语言 | C++ 关键字 | C 标准库函数 |
| 内存释放 | 调用析构函数并释放内存 | 只释放内存,不调用析构函数 |
| 适用对象 | 适用于 new 分配的内存 | 适用于 malloc 分配的内存 |
| 错误处理 | 对空指针安全 | 对空指针安全 |
3.3 示例对比
// 使用 new 和 delete
int* p1 = new int(10);
delete p1;// 使用 malloc 和 free
int* p2 = (int*)malloc(sizeof(int));
free(p2);
总结
new和malloc的主要区别在于是否调用构造函数以及语言特性。delete和free的主要区别在于是否调用析构函数。- 池化计数是一种高效的内存管理技术,适用于高频内存操作场景。
相关文章:
C++ 内存管理:深入理解 new、malloc、delete 和 free
引言 在 C 中,内存管理是一个非常重要的主题。正确使用动态内存分配和释放工具(如 new、malloc、delete 和 free)可以避免内存泄漏和程序崩溃。本文将深入探讨这些工具的区别,并介绍池化计数技术。 1. new 与 malloc 在动态申请内…...
基于互联网协议的诊断通信(DoIP)
1、ISO 13400标准和其他汽车网络协议标准有何不同? ISO 13400 标准即 DoIP 协议标准,与其他常见汽车网络协议标准(如 CAN、LIN、FlexRay 等)有以下不同: 通信基础与适用场景 ISO 13400:基于互联网协议&a…...
Android15 am命令 APP安装流程
一. PM 安装命令 使用命令 pm install -r xxx.apk pm命令安装app 会触发PackageManagerShellCommand 中runInstall()方法 frameworks/base/services/core/java/com/android/server/pm/PackageManagerShellCommand.java1. onCommand 函数: public int onCommand(String cmd…...
SpringMVC学习(初识与复习Web程序的工作流程)(1)
目录 一、SpringMVC(框架)的简要概述。 (1)SpringMVC与Servlet。 (2)技术方向。 (3)最终学习目标。 二、Web程序的基本工作流程。 (1)工作流程。 <1>浏览器。前后端任务。 <…...
解锁网络防御新思维:D3FEND 五大策略如何对抗 ATTCK
D3FEND 简介 背景介绍 2021年6月22日(美国时间),美国MITRE公司正式发布了D3FEND——一个网络安全对策知识图谱。该项目由美国国家安全局(NSA)资助,并由MITRE的国家安全工程中心(NSECÿ…...
评估自动驾驶(AD)策略性能的关键指标
以下是针对自动驾驶(AD)策略性能评测指标的详细解读,结合其物理意义与工程价值: 核心评测指标分类与含义 1. 安全性指标(Safety) 动态碰撞率(Dynamic Collision Ratio, DCR) 定义&a…...
【领域】百度OCR识别
一、定义 OCR(Optical Character Recognition,光学字符识别)是计算机视觉重要方向之一。传统定义的OCR一般面向扫描文档类对象,现在我们常说的OCR一般指场景文字识别(Scene Text Recognition,STRÿ…...
Docker 学习(一)
一、Docker 核心概念 Docker 是一个开源的容器化平台,允许开发者将应用及其所有依赖(代码、运行时、系统工具、库等)打包成一个轻量级、可移植的“容器”,实现 “一次构建,随处运行”。 1、容器(Container…...
15. C++多线程编程-网络编程-GUI编程(如Qt)学习建议
1. 多线程编程 多线程编程允许程序同时执行多个任务,从而提高性能和响应速度。多线程常用于处理并发任务、提高CPU利用率、优化I/O操作等。 学习内容: 线程与进程的区别:理解线程和进程的基本概念及其区别。 线程的创建与管理:…...
【vscode-解决方案】vscode 无法登录远程服务器的两种解决办法
解决方案一: 查找原因 命令 ps ajx | grep vscode 可能会看到一下这堆信息(如果没有大概率不是这个原因导致) 这堆信息的含义:当你使用 vscode 远程登录服务器时,我们远程机器服务端要给你启动一个叫做 vscode serv…...
5个GitHub热点开源项目!!
1.自托管 Moonlight 游戏串流服务:Sunshine 主语言:C,Star:14.4k,周增长:500 这是一个自托管的 Moonlight 游戏串流服务器端项目,支持所有 Moonlight 客户端。用户可以在自己电脑上搭建一个游戏…...
化学工业领域 - 基础化工、精细化工、煤化工极简理解
引入 基础化工、精细化工和煤化工是化学工业中的三个重要分支 它们在原料、产品、工艺、应用方面各有特点 一、基础化工(Basic Chemical Industry) 1、基本介绍 基础化工是指以石油、天然气、煤炭等为原料,生产大宗化学品和基础化学原料的…...
慢sql治理
一、慢SQL的定义与影响 慢SQL通常指的是执行时间超过合理阈值的SQL语句。这个阈值可以根据系统的实际情况进行设定,例如1秒或更长。慢SQL会导致系统响应时间延迟、资源占用增加、数据库连接池被占满、锁竞争增加等一系列问题,严重影响系统的稳定性和用户…...
基于SpringBoot的美妆购物网站系统设计与实现现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
计算机毕业设计Hadoop+Spark+DeepSeek-R1大模型音乐推荐系统 音乐数据分析 音乐可视化 音乐爬虫 知识图谱 大数据毕业设计
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
mysql5.7离线安装及问题解决
这次主要是讲解mysql5.7离线安装教程和一主一从数据库配置 1、去官网下载自己对应的mysql https://downloads.mysql.com/archives/community/2、查看需要安装mysql服务器的linux的类型 uname -a第二步看一下系统有没有安装mysql rpm -qa|grep -i mysql3、上传安装包 用远程…...
Matlab 大量接单
分享一个matlab接私活、兼职的平台 1、技术方向满足任一即可 2、技术要求 3、最后 技术方向满足即可 MATLAB:熟练掌握MATLAB编程语言,能够使用MATLAB进行数据处理、机器学习和深度学习等相关工作。 机器学习、深度学习、强化学习、仿真、复现、算法、…...
C++数据结构之数组(详解)
1.介绍 在C中,数组是一种基本的数据结构,用于存储相同类型的元素的集合。数组的元素在内存中是连续存储的,可以通过索引访问。下面将详细介绍C数组的相关内容。 2.数组的定义 数组的定义需要指定元素的类型和数组的大小。 type arrayName[a…...
AWS API Gateway灰度验证实现
在微服务架构中,灰度发布(金丝雀发布)是验证新版本稳定性的核心手段。通过将小部分流量(如 10%)导向新版本服务,可以在不影响整体系统的情况下快速发现问题。AWS API Gateway 原生支持流量按比例分配功能,无需复杂编码即可实现灰度验证。本文将详细解析其实现方法、最佳…...
【Elasticsearch】Elasticsearch 的`path.settings`是用于配置 Elasticsearch 数据和日志存储路径的重要设置
Elasticsearch 的path.settings是用于配置 Elasticsearch 数据和日志存储路径的重要设置,这些路径在elasticsearch.yml配置文件中定义。以下是关于 Elasticsearch 的路径设置(path.data和path.logs)以及快照存储库配置的详细说明:…...
Redis 实战篇 ——《黑马点评》(下)
《引言》 (下)篇将记录 Redis 实战篇 最后的一些学习内容,希望大家能够点赞、收藏支持一下 Thanks♪ (・ω・)ノ,谢谢大家。 传送门(上):Redis 实战篇 ——《黑马…...
蓝桥杯自我复习打卡
总复习,打卡1. 一。排序 1。选段排序 太可恶了,直接全排输出,一个测试点都没过。 AC 首先,这个【l,r】区间一定要包含p,或者q,pq一个都不包含的,[l,r]区间无论怎么变,都对ans没有影响。 其次&…...
Spring Boot拦截器(Interceptor)与过滤器(Filter)详细教程
Spring Boot拦截器(Interceptor)与过滤器(Filter)详细教程 目录 概述 什么是拦截器(Interceptor)?什么是过滤器(Filter)?两者的核心区别 使用场景 拦截器的典…...
Java零基础入门笔记:(6)面向对象
前言 本笔记是学习狂神的java教程,建议配合视频,学习体验更佳。 【狂神说Java】Java零基础学习视频通俗易懂_哔哩哔哩_bilibili 第1-2章:Java零基础入门笔记:(1-2)入门(简介、基础知识)-CSDN博客 第3章…...
【3天快速入门WPF】13-MVVM进阶
目录 1. 窗体设置2. 字体图标3. 控件模板4. 页面逻辑4.1. 不使用MVVM4.2. MVVM模式实现本篇我们开发一个基于MVVM的登录页面,用来回顾下之前学习的内容 登录页面如下: 窗体取消了默认的标题栏,调整为带阴影的圆角窗体,左侧放一张登录背景图,右边自绘了一个关闭按钮,文本框…...
【MongoDB】在Windows11下安装与使用
官网下载链接:Download MongoDB Community Server 官方参考文档:https://www.mongodb.com/zh-cn/docs/manual/tutorial/install-mongodb-on-windows/#std-label-install-mdb-community-windows 选择custom类型,其他默认 注意,此选…...
Kotlin 5种单例模式
在Kotlin中实现单例模式有多种方法,以下是几种常见的方法: 饿汉式 饿汉式是最简单的一种实现方式,在类加载时就完成了实例的初始化。 //饿汉式 object Singleton1 {fun printMessage() {println("饿汉式")} }懒汉式 懒汉式是延迟…...
C语言复习5:字符串的定义,字符串的常用函数
## 字符串变量的定义方式 - 在C语言中,没有单独的字符串变量,但可以利用字符数组来存字符串 - 占位符:%s - 定义1: 数据类型 变量名[内存占用大小] "字符串"; eg: char s…...
【Multipath网络层协议】MPTCP工作原理
常见网络层多路径协议介绍 MPTCP(Multipath TCP) MPTCP 是在传统 TCP 基础上进行扩展的协议,它允许在源端和目的端之间建立多个 TCP子流,这些子流可以通过不同的网络路径传输数据。 例如,一台笔记本电脑同时连接了 W…...
deepseek使用记录18——文化基因美食篇
子篇:薪火相传的味觉辩证法——从燧人氏到预制菜的文化突围 一、石器时代的启蒙:食物探索中的原始辩证法 在贾湖遗址的陶罐残片上,碳化稻米与蜂蜜的结晶层相互交叠,这是9000年前先民对"甘"与"饱"的首次辩证…...
