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

  • 能用,明理,能扩展


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

相关推荐
weixin_307779132 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
一水鉴天5 小时前
映射、哈希表与哈斯图:计算机科学的三种基线 20261003(元宝)
开发语言·人工智能
Frank_refuel5 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
Wang's Blog6 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
2601_962071577 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
hetao17338377 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
\光辉岁月/8 小时前
5.java-数组
java·开发语言
Java后端的Ai之路8 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
谢亮_vipxieliang8 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
longlongzihan8 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划