C++笔记 动态内存管理 auto,decltype关键字(基础)
一、动态内存管理
C++ 中使用new / delete进行动态内存管理(在堆上申请 / 释放内存),区别于栈内存自动分配释放。
1. 动态内存的意义
- 栈内存大小有限、自动销毁
- 堆内存大小由程序控制、手动管理生命周期
- 常用于数组、字符串、对象、大数据结构
2. new /delete 基本用法
(1)申请单个变量
int* p = new int; // 申请 int 大小内存 int* p2 = new int(10); // 申请并初始化值为 10(2)释放单个变量
delete p; p = nullptr; // 置空,避免野指针(3)申请数组
char* arr = new char[10]; // 申请 10 个 char int* arr2 = new int[5](); // 初始化为 0(4)释放数组
必须用 delete [],不能混用!
delete[] arr; arr = nullptr;3. new /delete 底层作用
new:申请堆内存 + 调用构造函数
delete:调用析构函数 + 释放内存
new[]:为数组申请空间
delete[]:为数组释放空间
4. 常见错误
delete后不置空 → 野指针
delete多次 → 崩溃
数组用delete释放 → 内存泄漏
不释放内存 → 内存泄漏
5. malloc /free 与 new /delete 区别
malloc 是函数,new 是关键字
malloc 不初始化,new 可以初始化
malloc 不调用构造 / 析构,new/delete 会调用
malloc 需要强转,new 不需要
malloc 按字节申请,new 按类型申请
二、auto 关键字(类型自动推导)
1. 作用
让编译器自动推导变量类型,不用手动写类型。
简化代码、提高可读性、尤其适合复杂类型。
2. 基本用法
auto a = 10; // int auto b = 3.14; // double auto c = "hello"; // const char*3. 与指针、引用结合
int x = 10; auto* p = &x; // int* auto& r = x; // int&4. 适用场景
迭代器
模板类型
复杂类型变量
代码简化
示例:
vector<int> v = {1,2,3}; for (auto it : v) { cout << it << endl; }5. 注意事项
auto 必须初始化才能推导
auto 不能作为函数参数(C++17 前)
auto 不能定义数组
三、decltype 关键字(类型推导)
1. 作用
推导一个表达式的类型,但不执行表达式。
常用于模板、泛型编程。
2. 基本语法
int a = 10; decltype(a) b = 20; // b 是 int 类型3. 特点
不会真正运行表达式
可以推导出引用、const
不要求变量初始化
int x = 10; decltype(x) y; // y 是 int,可以不初始化4. auto 与 decltype 区别
auto:通过初始化值推导
decltype:通过表达式推导
auto 会忽略引用、const
decltype 会保留引用、const
四、总结(背诵版)
动态内存管理
new /delete 用于堆内存申请与释放
数组必须用 new [] /delete []
释放后指针置空,避免野指针
auto
自动推导类型
必须初始化
简化复杂类型代码
decltype
推导表达式类型
不执行表达式
保留引用、const 属性
