【05】C++ 内存管理

文章目录

  • 🌈 Ⅰ C++ 内存分布
  • 🌈 Ⅱ C++ 内存管理方式
    • 1. new 和 delete 操作内置类型
    • 2. new 和 delete 操作自定义类型
  • 🌈 Ⅲ operator new 和 operator delete
  • 🌈 Ⅳ new 和 delete 的实现原理
    • 1. 内置数据类型
    • 2. 自定义数据类型
  • 🌈 Ⅴ malloc / free 和 new / delete 的区别

🌈 Ⅰ C++ 内存分布

C++ 中程序内存区域划分

内存区域说明
内核空间用户代码不能读写
向下增长 ↓,存储定义在函数内的局部变量
内存映射段文件映射、动态库、匿名映射
向上增长 ↑,用于存储动态开辟出来的空间
数据段也叫静态区,用于存包处全局数据、静态数据
代码段存储可执行代码 / 只读常量

🌈 Ⅱ C++ 内存管理方式

  • C++ 中通过 new 和 delete 操作符来替代 C语言 中 malloc 和 free 的功能

1. new 和 delete 操作内置类型

1. new 和 delete 操作内置类型格式

  • 创建和删除 单个 对象
内置类型* 对象名 = new 内置类型;delete 对象名;
  • 创建和删除 多个 对象
内置类型* 对象名 = new 内置类型(你要 new 出来的数量);delete[] 对象名;

2. new 和 delete 操作内置类型示例

  • 这里主要采用 int 类型作为演示,其他 C++ 内置的数据类型也可以这么整。

在这里插入图片描述

2. new 和 delete 操作自定义类型

  • 在申请自定义类型的空间时,new 会调用构造函数,delete 会调用析构函数

1. new 和 delete 操作自定义类型格式

  • 创建和删除 单个 对象
自定义类型名* 对象名 = new 自定义类型名(传给构造函数的参数);delete 对象名;
  • 创建和删除 多个 对象
自定义类型名* 对象名 = new 自定义类型名[创建对象的数量];delete[] 对象名;

2. new 和 delete 操作自定义类型示例

class date
{
public:date(int year = 1, int month = 1, int day = 1):_year(year),_month(month),_day(day){cout << "这是一个构造函数" << endl;}~date(){cout << "这是一个析构函数" << endl;}
private:int _year;int _month;int _day;
};int main()
{date* d1 = new date;			// new 一个日期类东西,并用缺省参数调用构造函数初始化date* d2 = new date(2024,2, 9);	// new 一个日期类对象,并用所给的值调用构造函数初始化date* d3 = new date[3];			// new 三个日期类对象,并对每个对象使用缺省参数初始化delete d1;						// 删除 new 出来的单个对象delete d2;delete[] d3;					// 删除 new 出来的多个对象return 0;
}

🌈 Ⅲ operator new 和 operator delete

概念

  • operator new 和 operator delete 是全局函数,不是对 new 和 delete 的重载。
  • new 在底层调用 operator new 函数申请空间,delete 则调用 operator delete 函数释放空间。
  • operator new 是对 malloc 的封装,operator delete 是对 free 的封装。

本质

  • operator new 实际上是通过 malloc 来申请空间,如果 malloc 申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。
  • operator delete 实际上是通过 free 来释放空间

🌈 Ⅳ new 和 delete 的实现原理

1. 内置数据类型

  • 如果申请的是内置类型的空间,new 和 malloc,delete 和 free 基本类似。
  • 不同的地方是 new / delete 申请和释放的是单个元素的空间,new [] 和 delete[] 申请和释放的是连续的空间。
  • new 在申请空间失败时会抛出异常,而 malloc 是返回 NULL。

2. 自定义数据类型

1. new 和 delete 的原理

  • new:先调用 operator new 函数申请空间,再在申请的空间上执行构造函数。
  • delete:先在空间上执行析构函数,完成对象中资源的清理工作。再调用 operator delete 函数去释放对象的空间。

在这里插入图片描述

2. new T[n] 和 delete[] 的原理

  • new T[n]:先调用 operator new[] 函数,在 operator new[] 函数中调用 operator new 函数完成对 n 个对象空间的申请。最后在申请的空间上执行 n 次构造函数。
  • delete[]:先在释放的对象空间上执行 n 次析构函数。再调用 operator delete[] 释放空间,实际是在 operator delete[] 中调用 operator delete 来释放空间。

在这里插入图片描述

🌈 Ⅴ malloc / free 和 new / delete 的区别

1. 共同点

  • 都是从堆上申请空间,并且都需要用户主动释放。

2. 不同点

  1. malloc 和 free 是函数,而 new 和 delete 是操作符。
  2. malloc 申请的空间不会被初始化,new 可以初始化申请的空间。
  3. malloc 申请空间时,还需要手动计算空间的大小并传递给 malloc 函数。new 只需要在后面跟上该对象的类型即可,如果要 new 多个对象,只需在 [] 中指定对象个数即可。
  4. malloc 的返回值为 void*,在使用时必须要进行强转。而 new 因为后面跟着该空间的类型,因此不需要对返回值进行强转。
  5. malloc 需要手动检查是否开辟空间失败。new 失败了是抛异常,不需要手动检查。
  6. 申请自定义类型对象时,malloc / free只会开辟空间。而 new 在申请空间后会调用构造函数完成对象的初始化,delete 在释放空间前会调用析构函数。

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

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

相关文章

vscode wsl远程连接 权限问题

问题描述&#xff1a;执行命令时遇到Operation not permitted 和 Permission denied问题&#xff0c;是有关ip地址和创建文件的权限问题&#xff0c;参考网络上更改wsl.conf文件等方法均无法解决&#xff0c;只能加sudo来解决

【北邮鲁鹏老师计算机视觉课程笔记】01 introduction

1 生活中的计算机视觉 生活中的各种计算机视觉识别系统已经广泛地应用起来了。 2 计算机视觉与其他学科的关系 认知科学和神经科学是研究人类视觉系统的&#xff0c;如果能把人类视觉系统学习得更好&#xff0c;可以迁移到计算机视觉。是计算机视觉的理论基础。 算法、系统、框…

【web前端开发】HTML及CSS简单页面布局练习

案例一 网页课程 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…

2 月 9 日算法练习- 数据结构 - 除夕快乐♪٩(´ω`)و♪

翻转括号序列 暴力过20%数据 思路&#xff1a;括号合法序列问题可以利用前缀和&#xff0c;将"(“看成 1&#xff0c;”)"看成 0&#xff0c;规律是到某个位置为止的前缀和>0并且到最后前缀和0。 #include<bits/stdc.h> using namespace std; const int N…

代码随想录 Leetcode55. 跳跃游戏

题目&#xff1a; 代码(首刷自解 2024年2月9日&#xff09;&#xff1a; class Solution { public:bool canJump(vector<int>& nums) {int noz 0;for (int i nums.size() - 2; i > 0; --i) {if (nums[i] 0) {noz;continue;} else {if (nums[i] > noz) noz …

跟着cherno手搓游戏引擎【22】CameraController、Resize

前置&#xff1a; YOTO.h: #pragma once//用于YOTO APP#include "YOTO/Application.h" #include"YOTO/Layer.h" #include "YOTO/Log.h"#include"YOTO/Core/Timestep.h"#include"YOTO/Input.h" #include"YOTO/KeyCod…

随机MM引流源码PHP开源版

引流源码最新随机MM开源版PHP源码&#xff0c;非常简洁好看的单页全解代码没任何加密 直接上传即可用无需数据库支持主机空间

【动态规划】【C++算法】LeetCoce996正方形数组的数目

作者推荐 【动态规划】【前缀和】【C算法】LCP 57. 打地鼠 本文涉及知识点 动态规划汇总 LeetCoce996正方形数组的数目 给定一个非负整数数组 A&#xff0c;如果该数组每对相邻元素之和是一个完全平方数&#xff0c;则称这一数组为正方形数组。 返回 A 的正方形排列的数目…

PbootCMS采集插件使用教程

这篇Pboot采集教程教你使用PbootCMS采集插件&#xff0c;自动批量采集网页文章数据&#xff0c;并发布到PbootCMS系统&#xff0c;快速丰富网站的内容。 1. 下载并安装PbootCMS采集插件 1-1&#xff09;PbootCMS采集插件免费下载&#xff1a;Pboot采集插件-PbootCMS发布模块下…

物品冷启动01_优化目标评价(包括基尼系数)

文章目录 物品冷启动冷启动的类型“新”按常规推送链路的角度按产品生态角度 物品冷启动的目标和评价指标作者侧用户侧 冷启动的衡量 物品冷启动 冷启动的类型 冷启动的内容种类包括很多方面&#xff0c;本文只介绍UGC的冷启动。 所谓UGC&#xff0c;就是User Generate Conte…

ARP欺骗攻击利用之抓取https协议的用户名与密码

1.首先安装sslstrip 命令执行&#xff1a;apt-get install sslstrip 2.启动arp欺骗 arpspoof -i ech0 -t 192.168.159.148 192.168.159.2 arpspoof -i ech0(网卡) -t 目标机ip 本地局域网关 3.命令行输入: vim /etc/ettercap/etter.conf进入配置文件 找到下红框的内容&a…

一周学会Django5 Python Web开发-Django5创建项目(用PyCharm工具)

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计11条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

英伟达进军定制芯片领域,有望“再造一个Arm”?

隔夜美股AI总龙头英伟达收高3.58%&#xff0c;再创历史新高。该股本周上涨逾9%&#xff0c;今年迄今上涨45.7%。总市值站上1.78万亿美元&#xff0c;逼近亚马逊与谷歌。 消息面上&#xff0c;据媒体报道&#xff0c;据至少九位知情人士透露&#xff0c;英伟达正在建立一个新的业…

Golang GC 介绍

文章目录 0.前言1.发展史2.并发三色标记清除和混合写屏障2.1 三色标记2.2 并发标记问题2.3 屏障机制Dijkstra 插入写屏障Yuasa 删除写屏障混合写屏障 3.GC 过程4.GC 触发时机5.哪里记录了对象的三色状态&#xff1f;6.如何观察 GC&#xff1f;方式1&#xff1a;GODEBUGgctrace1…

HiveSQL——设计一张最近180天的注册、活跃留存表

0 问题描述 现有一个用户活跃表user_active(user_id,active_date)、 用户注册表user_regist(user_id,regist_date)&#xff0c;表中分区字段都为dt(yyyy-MM-dd)&#xff0c;用户字段均为user_id; 设计一张 1-180天的注册活跃留存表&#xff1b;表结构如下&#xff1a; 1 数据分…

Agile Initiative, Epic, and Story/Task

Stories, also called “user stories,” are short requirements or requests written from the perspective of an end user. stories are something the team can commit to finish within a one- or two-week sprint.Epics are large bodies of work that can be broken do…

Java基础知识总结(持续更新中)

Java基础知识&#xff08;持续更新&#xff09; 类型转化&#xff1a;数字、字符串、字符之间相互转化 数字 <-> 字符串 // 数字转字符串 // method1int number 5;String str String.valueOf(number);// method2int number 5;Integer itr number; //int装箱为对…

C++:STL - vector

C&#xff1a;STL - vector 构造函数修改操作push_backpop_backerase 访问操作emptyoperatror[]backfront 容量操作sizecapacityresizereserve C的vector是一种可变长度的动态数组&#xff0c;被广泛用于C编程中。它是标准模板库&#xff08;STL&#xff09;中的容器之一&#…

【stomp实战】Springboot+Stomp协议实现聊天功能

本示例实现一个功能&#xff0c;前端通过websocket发送消息给后端服务&#xff0c;后端服务接收到该消息时&#xff0c;原样将消息返回给前端。前端技术栈htmlstomp.js&#xff0c;后端SpringBoot 前端代码 关于stomp客户端的开发&#xff0c;如果不清楚的&#xff0c;可以看…

2.6日学习打卡----初学RabbitMQ(一)

2.6日学习打卡 初识RabbitMQ、 一. MQ 消息队列 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保 存消息的容器。多用于系统之间的异步通信。 同步通信相当于两个人当面对话&#xff0c;你一言我一语。必须及时回复 异步通信相当于通…