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

C++ 内存管理和模板与STL

        此篇目是之后各种C++库的基础

目录

内存管理

        内存分布

        内存管理方式 

        new和delete 

         operator new 与 operator delete函数

        实现原理 

         定位new表达式(placement-new)

 模板基础

        泛型编程

        模板

        函数模板

        类模板

STL

         组成部分


内存管理

        内存分布

int globalVar = 1; //全局变量 静态区
static int staticGlobalVar = 1;//静态变量 静态区
void Test()
{
static int staticVar = 1;//静态变量 静态区
int localVar = 1;//局部变量 栈
int num1[10] = { 1, 2, 3, 4 };//局部变量 栈
char char2[] = "abcd";//局部变量 栈
const char* pChar3 = "abcd";//指针 栈 但是"abcd"是代码段(常量区)
int* ptr1 = (int*)malloc(sizeof(int) * 4);//指针 栈 指向堆
int* ptr2 = (int*)calloc(4, sizeof(int));//指针 栈 指向堆
int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);//指针 栈 指向堆
free(ptr1);
free(ptr3);
}

栈                存储非静态局部变量/函数参数/返回值 向下增长

内存映射段 高效的I/O映射方式,用于装载一个共享的动态内存库

堆                程序运行时动态内存分配,向上生长

数据段         全局数据与静态数据

代码段         可执行的代码/只读的常量

        内存管理方式 

        内存管理方式有 malloc/calloc/realloc/free

  1. malloc

    • 内存来源:在堆区申请一块连续的指定大小的内存块区域。
    • 初始化:不会进行内存初始化,即分配的内存区域可能包含任意数据。
  2. calloc

    • 内存来源:与malloc类似,也是用于动态地分配内存空间。
    • 初始化:会在分配内存时自动将内存清零,即将分配的内存区域的每一位都初始化为零。因此,calloc也被称为“零初始化内存分配器”。
  3. realloc

    • 内存来源:用于重新分配之前通过malloc、calloc或realloc分配的内存块。
    • 初始化:realloc本身不会进行初始化操作,但它会调整已分配内存块的大小,并根据需要调整内存块的位置。如果重新分配的内存区域比原来的大,则新分配的部分不会进行初始化。

        但是在C++中 引入了新的内存管理方式

        new和delete 

        因为有一些方面 原始的申请会有些无力 因此C++推出了自己的申请函数

int main()
{int* ptr1 = new int;//申请一个int空间int* ptr2 = new int(10);//申请一个int空间 并初始化为10int* ptr3 = new int[3];//申请3个int空间 可以认为是 数组delete ptr1;//普通的就用delete删除delete ptr2;delete[] ptr3; //[]出来的要用[]删除
}

        new和delete在对自定义类型操作时 也会有不同的变化

对自定义类型操作时

        new会调用自定义类型的构造函数

        delete会调用自定义类型的析构函数

malloc和free不会去调用

class A
{
public:A(int num = 0) :a(num) { cout << "A()" << endl;}~A() { cout << "~A()" << endl;}
private:int a;
};int main()
{A* ptra = new A(1);delete ptra;A* ptrb = new A[5];delete[] ptrb;return 0;
}

 

         operator new 与 operator delete函数

new与delete                              是用户进行内存申请和释放的 操作符

operator new与operator delete 是系统提供的                           全局函数

new    在底层 调用 operator new

delete 在底层 调用 operator delete

operator new    是通过 malloc 申请空间

operator delete 是通过 free     释放空间

        实现原理 

        new原理

        调用operator new申请空间 然后用构造函数完成对象构造

        delete原理

        调用析构函数清理对象 然后调用operator delete函数释放对象空间 

        new T[N]原理

        调用operator new[]函数,在operator new[]中调用operator new函数完成对N个对象的空间申请 然后用N此构造函数

        delete[]原理

        在要释放的对象空间上完成N次析构函数,然后对N个对象中资源的清理,然后调用operator delete[]释放空间,也就是在operator 

         定位new表达式(placement-new)

        解释

        定位new表达式是在已经分配的原始内存空间中调用构造含初始化了一个对象

        使用格式

        new (place_address)type 或者 new(place_address) type(initializer-list)

        place_address必须是一个指针initializer-list是类型的初始化列表 

         使用场景

        定位new表达式一般是配合内存池使用,因为内存池分配出的内存没有初始化,所以如果是自定义类型的对象,需要使用new的定义表达式进行显示调用构造函数进行初始化.

class A
{
public:A(int num = 0) :a(num) { cout << "A()"<< a;}~A() { cout << "~A()";}
private:int a;
};int main()
{A* p1 = (A*)malloc(sizeof(A));new(p1)A;//new重定位p1->~A();free(p1);cout << endl;A* p2 = (A*)malloc(sizeof(A));new(p2)A(10);//new重定位 然后给初始值p2->~A();free(p2);
}

 模板基础

        泛型编程

        用函数重载实现交换函数

void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
} 
void Swap(double& left, double& right)
{
double temp = left;
left = right;
right = temp;
} 
void Swap(char& left, char& right)
{
char temp = left;
left = right;
right = temp;
}

        从例子中看到,重载的函数仅仅只是类型不同,复用成度并不高,如果出现新的类型,就需要用户自己新增,而且无法一起修正错误,往往伴随着,错一个就错一堆,那么就要用到"模板" 了

        模板

        C++中存在一个模具,根据模具中填充的不同类型,获得不同的代码,泛型编程解释编译与类型无关的通用代码,方便代码复用.

模板分 函数模板 和 类模板

        函数模板

        概念

        函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生的函数的特定类型的版本

          格式

templat<typename T1,typename T2....>

返回值 函数名 参数

template<typename T1, class T2>
void Swap(T1& left, T2& right)
{T1 temp = left;left = right;right = temp;
}

        原理

        通过编译器使用的特殊方式产生具体类型函数的模具,模板就是将本应该我们做的重复的事情交给了编译器 

        实例化

        隐式调用

template<typename T1, class T2>
void Swap(T1& left, T2& right)
{T1 temp = left;left = right;right = temp;
}
int main()
{int a = 1;double b = 2;Swap(a, b);cout << a << b << endl;return 0;
}

        显式调用

template<typename T1, class T2>
void Swap(T1& left, T2& right)
{T1 temp = left;left = right;right = temp;
}
int main()
{int a = 1;double b = 2;Swap<int,double>(a, b);cout << a << b << endl;return 0;
}

        模板参数匹配原则

        我称之为:最多匹配优先原则,就是匹配拟合度最高的优先被调用

        而且无论是已存在的还是模板,都是按照拟合度最高的匹配 

void Swap(int left, int right)//优先匹配 int int
{int temp = left;left = right;right = temp;
}template<typename T1>//匹配 两个相同参数
void Swap(T1& left, T1& right)
{T1 temp = left;left = right;right = temp;
}template<typename T1,int>//匹配 T1 和 int 优先
void Swap(T1& left, int& right)
{T1 temp = left;left = right;right = temp;
}template<typename T1, class T2>//任意两个类型
void Swap(T1& left, T2& right)
{T1 temp = left;left = right;right = temp;
}

        类模板

        也就是 使用模板参数当作类里面参数 

             定义格式

template<class T1,class T2>
class name
{
public://...
private:T1 _t1;T2 _t2://...
};

        注意

        模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误

        实例化

template<class T1,class T2>
class name
{
public://...
private:T1 _t1;T2 _t2://...
};
int main()
{name<int, int> A;name<int, char> B;
}

STL

        STL是C++标准库的重要组成部分,是标准模板库,不仅是一个可复用的组件库,而且是一个包含数据机构与算法的软件框架

         组成部分

        仿函数 算法 迭代器 空间配置器 容器 配接器 

        本章结言

我将会在下一章开始写 

string

vector

list

stack

queue

等基础STL的应用与实现

相关文章:

C++ 内存管理和模板与STL

此篇目是之后各种C库的基础 目录 内存管理 内存分布 内存管理方式 new和delete operator new 与 operator delete函数 实现原理 定位new表达式(placement-new) 模板基础 泛型编程 模板 函数模板 类模板 STL 组成部分 内存管理 内存分布 int globalVar 1; //全局变量 静…...

JDK8新特性:Stream

JDK8最大的改变&#xff1a; 1. lambda表达式 2. Stream 1. Steam流的入门 什么是Stream&#xff1f; 也叫Stream流&#xff0c;是jdk8开始的一套API&#xff0c;用于操作集合或者数组中的数据 优点&#xff1a; Stream流大量结合了Lambda的语法风格来创建&#xff0c;提…...

前端传入Grule,后端保存到 .grl 文件中

前端传入Grule&#xff0c;后端保存到 .grl 文件中 通过简单的输入框&#xff0c;将Grule的部分拆解成 规则名称 规则描述 规则优先级 规则条件 规则逻辑Grule关键字 when Then 模拟了 if 判断的条件和逻辑部分 类似于 shell 和 ruby 之类的脚本语言&#xff0c;有 then 关键字…...

探索《Crypto Rumble》 游戏:经济模型篇

《Crypto Rumble》是一款基于 Zypher Network 游戏引擎打造的卡牌 RPG三消品类的 Web3 游戏&#xff0c;通过引人入胜的游戏设计以及轻量化的游戏玩法&#xff0c;《Crypto Rumble》不仅能够为玩家带来引人入胜的沉浸式游戏体验&#xff0c;同时基于 AI Bot 的游戏编辑器&#…...

【CSS in Depth 2 精译_072】第 12 章 CSS 排版与间距概述 + 12.1 间距设置(上):究竟该用 em 还是 px

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 ✔️ 12.1.1 使用 em 还是 px ✔️12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 文章目录 第 12 章 排版与间距…...

Elasticsearch对象映射

Spring Data Elasticsearch对象映射是将Java对象&#xff08;域实体&#xff09;映射到存储在Elasticsearchs中的JSON表示形式并返回的过程。内部用于此映射的类是MappingElasticsearchConverter。 元模型对象映射 基于元模型的方法使用域类型信息对Elasticsearch进行读写操作…...

Oracle 19c rac 补丁升级,从19.7 to19.22-集群

1. 补丁包概述 数据库环境 角色 数据库 IP地址 数据库版本 主机名 数据库名称 源端 RAC 172.30.21.166/167 19.7 hfcwdb66/hfcwdb67 hfdb 将以下补丁包上传到/soft下 上传到两个节点的soft目录下&#xff1a;p6880880_190000_Linux-x86-64.zip &#xff08;更新o…...

机器学习--Kaggle的使用

机器学习–Kaggle的使用 打开Kaggle: Your Machine Learning and Data Science Community并点击Sign In登录账号 kaggle中自带了很多的数据集 在点击Datasets之后&#xff0c;单点Notebook&#xff0c;如果有适用的数据集可以单击Copy and Edit复制其Notebook&#xff0c;之后…...

客户服务新突破,天润融通助力电动车企业实现数智化转型

近年来&#xff0c;两轮电动车成为年轻人喜爱的出行新方式&#xff0c;借着这种潮流&#xff0c;许多新兴品牌迅速发展&#xff0c;并跻身行业头部。 但问题也随之而来&#xff0c;由于业务快速发展&#xff0c;各类服务问题也开始增多。 比如天润融通服务的一家头部两轮电动…...

力扣题目 - 2931.购买物品的最大开销

题目 还需要你前往力扣官网查看详细的题目要求 地址 思路 这边需要你去力扣官网详细查看题目看了题目提供的示例 已经有了解法, 先把values转成1维数组,排序之后进行累加即可 代码 var maxSpending function (values) {let list values.flat();list.sort((a, b) > a - …...

智慧化工园区自动化在线监测,建立产业链路数字安全网

智慧化工升级国家政策推动安全风险频发 化工园区作为化工产业的核心集聚地&#xff0c;在全球经济中占据重要地位。为推动行业的高质量发展&#xff0c;国家相继发布了《“十四五”危险化学品安全生产规划方案》、《石化化工行业数字化转型实施指南》和《化工园区安全风险智能化…...

在Docker中运行MySQL的思考:挑战与解决方案

引言 在云计算和容器化技术日益普及的今天&#xff0c;Docker作为一种轻量级的容器化平台&#xff0c;已经成为开发和部署应用的首选工具之一。其提供的便携性、可扩展性和环境一致性对于无状态微服务来说无疑是巨大的福音。然而&#xff0c;并非所有应用都适合在Docker容器中…...

Linux中所有和$有关的操作

prog < file 命令在 Shell 编程中用于 输入重定向&#xff0c;它将文件的内容作为程序的输入。即&#xff0c;程序 prog 会从文件 file 中读取数据&#xff0c;而不是从标准输入&#xff08;通常是键盘&#xff09;读取数据。 基本语法&#xff1a; prog < file 解释&…...

github操作学习笔记(杂乱版)

git开源的分布式版本控制系统&#xff1a; 每次修改文件提交后&#xff0c;都会自动创建一个项目版本 查看git版本看有没有安装成功&#xff1a;git --version 把默认编辑器设置成vim&#xff1a;git config --global core.editor "vim" 1、设置昵称和邮箱&#xff…...

学习思考:一日三问(思考篇)之路由表

学习思考&#xff1a;一日三问&#xff08;思考篇&#xff09;之路由表 学了什么&#xff08;是什么&#xff09;Destination/Mask&#xff08;最终目标&#xff0c;寻路必须&#xff09;Proto&#xff08;择优可选&#xff09;Pre&#xff08;择优可选&#xff09;Cost&#x…...

多个NVR同时管理EasyNVR:设置了“按需拉流超时”配置但没反应的解决方法

视频监控这一技术在当今社会的应用已然愈发广泛&#xff0c;其影响力渗透至我们生活的方方面面。它不仅为我们带来了更为坚固的安全防线&#xff0c;还在诸多行业领域中发挥着不可替代的作用。 在广泛的应用领域中&#xff0c;NVR录像机汇聚管理EasyNVR凭借其卓越的技术实力与前…...

基于Springboot的实验室管理系统【附源码】

基于Springboot的实验室管理系统 效果如下&#xff1a; 系统登录页面 实验室信息页面 维修记录页面 轮播图管理页面 公告信息管理页面 知识库页面 实验课程页面 实验室预约页面 研究背景 在科研、教育等领域&#xff0c;实验室是进行实验教学和科学研究的重要场所。随着实验…...

【Oracle11g SQL详解】常用字符串函数:`CONCAT`、`SUBSTR`、`LENGTH`、`INSTR` 等

常用字符串函数&#xff1a;CONCAT、SUBSTR、LENGTH、INSTR 等 字符串函数在 SQL 中被广泛用于处理文本数据&#xff0c;例如拼接字符串、提取子串、查找字符位置等。Oracle 11g 提供了强大的字符串函数&#xff0c;可以简化对字符串的操作。 一、CONCAT&#xff1a;拼接字符串…...

某养老产业公司管理诊断项目成功案例纪实

某养老产业公司管理诊断项目成功案例纪实 ——从短期和长期出发&#xff0c;提供转型改革建议 【客户行业】养老行业 【问题类型】问题诊断 【客户背景】 某养老产业公司是一家主要从事养老服务为主的企业&#xff0c;主营业务包括社区养老服务、居家养老、康复训练服务等…...

自然语言处理基础及应用场景

自然语言处理定义 让计算机理解人所说的文本 语音 Imitation Game 图灵测试 行为主义 鸭子理论 自然语言处理的基本任务 词性标注&#xff1a;区分每个词名词、动词、形容词等词性命名实体的识别&#xff1a;名词的具体指代是哪一类事物共指消解&#xff1a;代词指代的是前面…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...