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

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 属性

http://www.cnnetsun.cn/news/1518213.html

相关文章:

  • 提升开发效率与视觉舒适度:LxgwWenKai字体全场景配置指南
  • 手把手教你实现vue3无限滚动列表:vant下拉刷新+分页加载与虚拟滚动的完美结合
  • 树莓派4B的USB3.0/2.0全攻略:从硬件原理到故障排查(含CM4对比)
  • Vant项目实战:如何优雅地在移动端使用阿里图标库(附常见问题解决)
  • Qwen2.5-VL-Chord精彩效果:支持‘图中与我穿同款衣服的人’跨图像关联定位
  • 如何从零到一写好一个 AI Agent
  • 实战指南:用LCD和Triplet Loss搞定2D-3D配准(附避坑技巧)
  • YimMenu安全增强指南:四阶法实现GTA V体验升级
  • OpenClaw会议纪要神器:Qwen3-VL:30B转录飞书语音与截图
  • 双模型协作方案:OpenClaw同时接入Qwen3.5-9B与本地小模型
  • 从音频到图像:一文搞懂FFT(快速傅里叶变换)在MATLAB中的实战应用
  • SecGPT-14B开源可部署优势:代码完全可控,满足金融/政务行业数据不出域要求
  • 立知lychee-rerank-mm效果实测:电商商品搜索排序,准确率大幅提升
  • 避坑指南:LabVIEW调用海康机器人相机SDK时常见的5个错误及解决方法
  • STM32智能婴儿床系统设计与实现
  • 从实验到实战:DNS攻击的三种常见手法深度解析与防御配置(附Bind9加固指南)
  • DeepSeek豆包写的论文怎么降AI率?详细降AI率教程+工具实操指南
  • OpenClaw多端控制:手机QQ远程触发nanobot任务实操
  • MindSpeed并行优化:突破大模型训练的效率瓶颈
  • 告别界面老气!用Qt和SARibbon给你的C++桌面应用做个Office风现代化UI
  • modelsim crack过程中显示dll文件找不到解决方法
  • OpenClaw浏览器自动化:GLM-4.7-Flash模拟人工填写表单
  • 5分钟掌握微信/QQ/TIM消息防撤回技术:从原理到实践的完整方案
  • AI赋能:借助快马平台智能模型优化openclaw onboard抓取算法
  • BiliTools跨平台哔哩哔哩工具箱:一站式B站资源管理终极解决方案
  • PHP 8.5 升级生存指南:避免凌晨两点回滚的检查清单
  • HunyuanVideo-Foley惊艳效果:雨滴敲窗声+室内读书场景视频生成
  • C语言的重载——变参函数
  • 工业大数据价值究竟在哪?不只是分析,更是精准决策与执行
  • py每日spider案例之随即视频接口获取