新号别搞:内存管理+模板初阶+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++标准库的重要组成部分

  • 能用,明理,能扩展


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

相关推荐
敲代码的瓦龙1 小时前
Jetpack?ViewModel!!!
android·开发语言·kotlin·android-studio
白远山1 小时前
智慧场馆解决方案软件开发实战:从架构设计到落地部署指南
java·开发语言·架构·需求分析
IT笔记2 小时前
Rust 迭代器多级链式调用执行顺序笔记
开发语言·笔记·rust
雪落漂泊2 小时前
C++11(上)
开发语言·c++
春涧草茶2 小时前
慢就是快12-2三种访问权限|getter与setter|魔法方法
开发语言·python
無限進步D3 小时前
Java Web 前端 简介
java·开发语言·前端·css·html·css3·web
qq_401700413 小时前
Qt QUrl 详解与代码示例
开发语言·数据库·qt
zh路西法3 小时前
【玩转VLA具身智能机械臂】(四):点云分割与 OBB 夹取——从 PCA 失效到主动扫描
c++·机械臂·pca·vla·planner·obb·moveit2
小灰灰搞电子3 小时前
Rust Attribute(属性标记)完整整理
开发语言·后端·rust