新号别搞:内存管理+模板初阶+STL简介


1.内存管理


1.1. 入手题目



1.1.1 图像理解


1.1.2 C++内存管理

  • C++内存管理方式:通过new和delete操作符进行动态内存管理
cpp 复制代码
int main() {
	int* p1 = new int;//动态申请一个int类型空间(会调用构造函数)
	int* p2 = new int(10);//动态申请一个int类型空间+初始化10
	int* p3 = new int[10];//动态申请十个int类型空间
	int* p4 = new int[10] {1,2,3};//动态申请十个int类型空间+花括号初始化(没有值的为0)
	delete p1;//析构+释放动态空间
	delete p2;
	delete[] p3;
	delete[] p4;
}
  • new/delete 和 malloc/free最大区别是 new/delete对于++【自定义类型 】++ 开空间 + 调用构造函数 / 析构函数
  • 单个,用new和delete操作符;连续,用new\[\]和delete\[\]
  • new和delete是用户进行动态内存申请和释放的操作符,
    operator new 和operator delete是系统提供的全局函数,
    • new在底层调用operator new全局函数来申请空间(失败会抛异常),
    • delete则是operator delete全局函数来释放空间

1.2 malloc/free和new/delete


  • 不同点
  • 共同点:从堆上申请空间,需要用户手动释放

1.3 new和delete的实现原理


1.3.1 内置类型(基本相似)

  • new/delete申请和释放的是单个元素的空间,new\[\]和delete\[\]申请的是连续空间
  • new在申请空间失败时会抛异常 ,malloc会返回NULL。

1.3.2 自定义类型

  • new的原理
      1. 调用++operator new++函数申请空间
      1. 在申请的空间上执行构造函数,完成对象的构造
  • delete的原理
      1. 在空间上执行析构函数,完成对象中资源的清理工作
      1. 调用operator delete函数释放对象的空间
  • **new TN**的原理
      1. 在operator new\[\]中实际调用operator new函数完成N个对象空间的申请
      1. 在申请的空间上执行N次构造函数
  • delete\[\]的原理
      1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理
      1. 在operator delete\[\]中调用operator delete来释放空间

2. 模板初阶


2.1 泛型编程

编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。


2.1.1 函数模板

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

  • template<typename T1, typename T2,......,typename Tn>
    ++返回值类型 函数名(参数列表){}++
    (typename是用来定义模板参数关键字,也可以使用class)
  • 编译器编译阶段,模板函数调用,编译器根据传入的实参类型推出对应类型的函数以供调用
  • 函数模板的实例化,不同类型的参数使用函数模板
    • 隐式实例化 :让编译器根据实参推演模板参数的实际类型
      (在模板中,编译器一般不会进行类型转换操作)
    • 显式实例化 :在++函数名后的<>++ 中指定模板参数的实际类型(Add<int>(a, b);)
  • 一个非模板函数(成品)可以和一个同名的函数模板(半成品)同时存在,该函数模板还可被实例化为这个非模板函数
    • 确定是成品情况,直接调用成品;不是或生成更好匹配的则调用半成品
    • 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

2.1.2 类模板

  • 模板不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误
  • 类模板的实例化
    • 类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中
      • 类模板名字不是真正的类 ,而实例化的结果才是真正的类

3. STL简介


  • STL(standard template libaray-标准模板库): C++标准库的重要组成部分

  • 能用,明理,能扩展


完~走过路过不要错过,有错请指出谢谢

相关推荐
Rabitebla14 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
eggwyw15 小时前
Anaconda安装卸载的详细流程指南
开发语言·python
码客-ygluu20 小时前
一个通用游戏数据服务器
c++·架构
another heaven20 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
SomeOtherTime21 小时前
Rust 闭包语法和原理(AI回答)
开发语言·后端·rust
apcipot_rain1 天前
C++转Java日记(10)
java·开发语言
总要学点什么1 天前
第105篇:三维特效-流动图片墙体效果——让箭头沿墙长滚,它俩竟是同一份代码
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
YLCHUP1 天前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
xiaoye-duck1 天前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
思麟呀1 天前
背包DP(01背包+完全背包)
c++·算法