C++ 是一门广泛应用于高性能计算、游戏开发、嵌入式系统和底层系统编程的语言

C++ 是一门广泛应用于高性能计算、游戏开发、嵌入式系统和底层系统编程的语言。其核心优势在于对内存的精细控制和接近硬件的操作能力。以下是围绕你提供的“核心学习路径”进行的详细解析与实战示例。


1. 基础语法

变量与数据类型
inta=10;doubleb=3.14;charc='A';boolflag=true;
指针与引用
intx=5;int*ptr=&x;// 指针指向x的地址int&ref=x;// 引用,ref是x的别名(*ptr)++;// x变为6ref++;// x变为7
流程控制
if(a>5){cout<<"a is greater than 5\n";}else{cout<<"a is not greater than 5\n";}for(inti=0;i<5;++i){cout<<i<<" ";}
类与对象、继承 / 多态
classAnimal{public:virtualvoidspeak(){cout<<"Animal speaks\n";}};classDog:publicAnimal{public:voidspeak()override{cout<<"Woof!\n";}// 多态实现};// 使用Animal*pet=newDog();pet->speak();// 输出: Woof!deletepet;

2. 核心特性

STL 容器:vector 和 map
#include<vector>#include<map>#include<iostream>usingnamespacestd;// vector 示例vector<int>nums={3,1,4,1,5};sort(nums.begin(),nums.end());// 排序后: 1,1,3,4,5// map 示例map<string,int>ages;ages["Alice"]=25;ages["Bob"]=30;for(auto&pair:ages){cout<<pair.first<<": "<<pair.second<<endl;}
内存管理(new/delete)
int*p=newint(42);// 动态分配一个整数cout<<*p<<endl;// 输出 42deletep;// 释放内存// 数组版本int*arr=newint[10];for(inti=0;i<10;++i)arr[i]=i*i;delete[]arr;// 注意使用 delete[]

⚠️ 现代 C++ 推荐使用智能指针(如unique_ptr,shared_ptr)避免手动管理内存。


3. 实战案例

案例一:数组排序(快速排序)
#include<iostream>usingnamespacestd;voidquickSort(intarr[],intlow,inthigh){if(low>=high)return;intpivot=arr[(low+high)/2];intleft=low,right=high;while(left<=right){while(arr[left]<pivot)left++;while(arr[right]>pivot)right--;if(left<=right){swap(arr[left],arr[right]);left++;right--;}}quickSort(arr,low,right);quickSort(arr,left,high);}intmain(){intdata[]={64,34,25,12,22,11,90};intn=sizeof(data)/sizeof(data[0]);quickSort(data,0,n-1);for(inti=0;i<n;++i)cout<<data[i]<<" ";return0;}
案例二:猜数字小游戏
#include<iostream>#include<cstdlib>#include<ctime>usingnamespacestd;intmain(){srand(time(0));intsecret=rand()%100+1;intguess;cout<<"Guess the number (1-100): ";while(cin>>guess){if(guess==secret){cout<<"Congratulations! You guessed it!\n";break;}elseif(guess<secret){cout<<"Too low! Try again: ";}else{cout<<"Too high! Try again: ";}}return0;}

在现代 C++(尤其是 C++11 及以后标准)中,推荐使用智能指针来自动管理动态内存,避免手动调用newdelete导致的内存泄漏、重复释放或异常安全问题。最常用的智能指针是std::unique_ptrstd::shared_ptr


1.std::unique_ptr:独占所有权

  • 一个对象只能被一个unique_ptr拥有。
  • 不可复制,但可移动(move semantics)。
  • unique_ptr离开作用域时,自动释放其所指向的对象。
示例:
#include<iostream>#include<memory>// 必须包含头文件classMyClass{public:MyClass(){std::cout<<"MyClass constructed\n";}~MyClass(){std::cout<<"MyClass destructed\n";}voidsayHello(){std::cout<<"Hello from MyClass!\n";}};intmain(){// 创建 unique_ptrstd::unique_ptr<MyClass>ptr=std::make_unique<MyClass>();ptr->sayHello();// 使用 -> 调用成员函数// 自动析构:当 main 结束时,ptr 被销毁,对象自动删除return0;}

✅ 输出:

MyClass constructed Hello from MyClass! MyClass destructed
移动语义示例:
autoptr1=std::make_unique<MyClass>();// auto ptr2 = ptr1; // 错误!不能复制autoptr2=std::move(ptr1);// 正确:转移所有权// 此时 ptr1 为空,ptr2 拥有对象

2.std::shared_ptr:共享所有权

  • 多个shared_ptr可以共享同一个对象。
  • 使用引用计数机制:每当增加一个shared_ptr,计数 +1;减少则 -1。
  • 当引用计数为 0 时,对象自动销毁。
示例:
#include<iostream>#include<memory>intmain(){// 创建 shared_ptrstd::shared_ptr<MyClass>ptr1=std::make_shared<MyClass>();{std::shared_ptr<MyClass>ptr2=ptr1;// 共享所有权std::cout<<"Reference count: "<<ptr1.use_count()<<"\n";// 输出 2}// ptr2 离开作用域,计数减为 1std::cout<<"Reference count: "<<ptr1.use_count()<<"\n";// 输出 1return0;// 此时 ptr1 析构,计数变为0,对象被删除}

✅ 输出:

MyClass constructed Reference count: 2 Reference count: 1 MyClass destructed

3. 如何创建智能指针?

推荐方式说明
std::make_unique<T>()C++14 起支持,安全创建unique_ptr
std::make_shared<T>()高效创建shared_ptr,建议优先使用

⚠️不要这样写

// ❌ 危险:可能造成内存泄漏(异常中断)std::function<void()>f(newMyClass(),[](MyClass*p){deletep;});// 如果 new MyClass() 成功,但在构造函数后抛出异常,资源将未被管理

✅ 应该使用make_unique/make_shared来避免此类问题。


4. 实际应用场景对比

场景推荐智能指针
工厂模式返回对象std::unique_ptr<Base>
树节点中的父/子关系(避免循环引用)子用std::weak_ptr,父用std::shared_ptr
多个对象共享同一资源(如缓存)std::shared_ptr
临时动态对象(如局部对象)std::unique_ptr

5. 注意事项

  • 避免shared_ptr循环引用(例如 A 指向 B,B 又指向 A),会导致内存无法释放。
  • 使用std::weak_ptr解决循环引用问题。
  • 尽量避免从原始指针构造智能指针(容易出错)。
示例:循环引用问题与weak_ptr解法
structNode;usingNodePtr=std::shared_ptr<Node>;usingWeakNode=std::weak_ptr<Node>;structNode{intid;WeakNode parent;// 使用 weak_ptr 避免循环引用Node(inti):id(i){std::cout<<"Node "<<id<<" created\n";}~Node(){std::cout<<"Node "<<id<<" destroyed\n";}};

RAII(Resource Acquisition Is Initialization,资源获取即初始化)是 C++ 中一种重要的编程范式,其核心思想是:

将资源的生命周期绑定到对象的生命周期上—— 资源在对象构造时获取,在对象析构时自动释放。

这里的“资源”不仅指内存,还包括文件句柄、网络连接、互斥锁、数据库连接等任何需要申请和释放的系统资源。


RAII 的基本原理

  1. 构造函数中获取资源(如 new 内存、open 文件)
  2. 析构函数中释放资源(如 delete、close)
  3. 利用 C++ 的确定性析构机制(对象离开作用域时必定调用析构函数),确保资源不会泄漏。
示例:RAII 管理文件
#include<fstream>#include<iostream>classFileHandler{std::ofstream file;public:FileHandler(conststd::string&filename){file.open(filename);if(!file.is_open()){throwstd::runtime_error("Cannot open file!");}std::cout<<"File opened: "<<filename<<"\n";}voidwrite(conststd::string&data){file<<data<<std::endl;}~FileHandler(){if(file.is_open()){file.close();std::cout<<"File closed.\n";}}};intmain(){try{FileHandlerfh("output.txt");fh.write("Hello, RAII!");// 离开作用域时自动关闭文件,无需手动调用 close()}catch(conststd::exception&e){std::cerr<<e.what()<<std::endl;}return0;}

即使中间发生异常,C++ 的栈展开机制也会调用局部对象的析构函数,从而保证资源被正确释放。


智能指针是 RAII 的典型实现

std::unique_ptrstd::shared_ptr就是基于 RAII 原则设计的经典工具:

特性如何体现 RAII
构造时分配内存make_uniquenew时获取堆内存
析构时释放内存离开作用域时自动调用deletedelete[]
异常安全即使抛出异常,栈上智能指针仍会析构,防止内存泄漏
示例对比:原始指针 vs RAII(智能指针)

❌ 手动管理容易出错:

voidbad_example(){MyClass*ptr=newMyClass();do_something();// 如果这里抛出异常deleteptr;// 这行不会执行 → 内存泄漏!}

✅ 使用 RAII 自动管理:

voidgood_example(){autoptr=std::make_unique<MyClass>();do_something();// 即使抛出异常,ptr 析构时自动释放内存}// 自动 delete

RAII 的优势

  • 异常安全:无论是否发生异常,资源都能被释放。
  • 代码简洁:无需在多处写deleteclose()
  • 避免资源泄漏:只要对象是局部变量或成员变量,就能保证析构。
  • 通用性强:可用于内存、锁、socket、GUI 句柄等所有资源。

其他 RAII 应用示例

1. 锁管理(std::lock_guard
std::mutex mtx;voidthread_safe_func(){std::lock_guard<std::mutex>lock(mtx);// 构造时加锁// 操作共享数据// 析构时自动解锁,即使发生异常也安全}
2. 自定义资源管理类

比如数据库连接、图形上下文等都可以封装成 RAII 类型。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1158911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LoRA 训练过程详解:从 0 到“懂你”的进化之路

接上文&#xff1a;LoRA 矩阵分解&#xff1a;Rank&#xff08;秩&#xff09;与数值的确定机制 “梯度更新”听起来很抽象&#xff0c;我们用一个教大模型写诗的例子&#xff0c;来看看矩阵 A 和 B 是怎么一步步“长脑子”的&#xff0c;也就是它们如何从随机数和零值&#xf…

在 PyTorch 中训练一个简单的神经网络包括以下几个核心步骤:定义模型、准备数据、选择损失函数和优化器、编写训练循环

在 PyTorch 中训练一个简单的神经网络包括以下几个核心步骤&#xff1a;定义模型、准备数据、选择损失函数和优化器、编写训练循环。下面以一个简单的线性回归任务为例&#xff0c;演示完整流程。✅ 步骤 1&#xff1a;导入必要的库 import torch import torch.nn as nn import…

协议十年演进

下面给你一条从工程系统、平台化与自治治理视角出发的 「协议十年演进路线&#xff08;2025–2035&#xff09;」。 这里的“协议”不只是通信格式&#xff0c;而是系统之间如何理解彼此、约束彼此、协同运行的根本机制。一、核心判断&#xff08;一句话&#xff09;未来十年&a…

Go(又称Golang)是一种由Google开发的静态类型、编译型编程语言,设计初衷是解决大规模软件工程中的效率与协作问题

Go&#xff08;又称Golang&#xff09;是一种由Google开发的静态类型、编译型编程语言&#xff0c;设计初衷是解决大规模软件工程中的效率与协作问题。其核心优势在于高性能、高并发支持、语法简洁&#xff0c;并具备高效的垃圾回收机制和强大的标准库。 特性与应用场景&#x…

ZYNQ MPSOC VCU介绍

关注、星标公众号&#xff0c;精彩内容每日送达 来源&#xff1a;网络素材1 什么是VCU?VCU 的全称是 Video Codec Unit&#xff0c;即视频编解码单元&#xff0c; Zynq UltraScale MPSoC 系列产品分为三种类型&#xff0c;分别是 CG 型器件、 EG 型器件和 EV 型器件&#xff0…

硬核解析:英伟达机器人的技术内核与落地场景全攻略硬核解析:英伟达机器人的技术内核与落地场景全攻略

2026年CES展会上&#xff0c;英伟达Reachy Mini机器人&#xff08;酷似“瓦力”&#xff09;的流畅互动惊艳全场&#xff0c;这背后并非单纯的设计创新&#xff0c;而是其“全栈技术体系多元场景适配”的实力彰显。作为AI与机器人领域的核心玩家&#xff0c;英伟达正通过一套从…

监控十年演进

下面给你一条从工程实践、系统复杂度与自治运维视角出发的 「监控十年演进路线&#xff08;2025–2035&#xff09;」。 这里的“监控”不只是看指标&#xff0c;而是系统如何被理解、被约束、被治理。一、核心判断&#xff08;一句话&#xff09;未来十年&#xff0c;监控将从…

如何测试生成式AI?ChatGPT类应用的质量保障

生成式AI测试的必要性与挑战 生成式AI&#xff08;如基于大型语言模型的ChatGPT类应用&#xff09;正迅速改变人机交互方式&#xff0c;但也带来了前所未有的测试复杂性。与传统软件不同&#xff0c;生成式AI的输出具有高度不确定性、语境依赖性和伦理敏感性。2026年&#xff…

人工智能应用-机器视觉:车牌识别(5)

字符识别 一、分割识别方法 传统方法一般采用“先切割&#xff0c;再识别”的策略&#xff0c;即先对车牌图像进行字符分割&#xff0c;然后将每个字符输入一个分类器进行识别。例如&#xff0c;在下图 3.2.12 中&#xff0c;首先将车牌图片分成“渝”“A”“J”“I”“2”“2…

孤胆枪手下载安装教程(2026 最新版)|下载 + 安装 + 运行配置全流程图文详解

一、前言&#xff1a;为什么现在还需要孤胆枪手下载安装教程 《孤胆枪手&#xff08;Alien Shooter&#xff09;》是一款经典的俯视角射击游戏&#xff0c;以极高的爽快度和密集怪物数量著称。 即便发布多年&#xff0c;依然有大量玩家希望在新电脑上重温这款作品。 但在 Win…

人工智能应用-机器视觉:车牌识别(6)

一、端到端序列识别方法 更先进的方法利用循环神经网络&#xff08;RNN&#xff09;的序列建模能力&#xff0c;不需要对字符进行逐一切割&#xff0c;而是对车牌图像中的字符串做整体识别。如下图 24.14所示&#xff1a;首先利用卷积神经网络&#xff08;CNN&#xff09;对输入…

Vidu 的短剧制作能力分析

短剧行业真正需要的从来不是“会不会拍”&#xff0c;而是“能不能稳定地、低成本地、按节奏产出”。在这种工业逻辑下&#xff0c;任何一款视频生成工具的价值都不取决于它能生成多惊艳的一段视频&#xff0c;而取决于它能否进入短剧生产链条&#xff0c;成为可复用、可交付、…

ThreadX的CMSIS-RTOS V2封装层升级至V1.4.0(2026-01-14)

https://github.com/STMicroelectronics/stm32-mw-cmsis-rtos-tx CMSIS-RTOS v2&#xff08;简称 CMSIS-RTOS2&#xff09;为基于 Arm Cortex 处理器的设备提供了通用的实时操作系统接口。它为需要实时操作系统功能的软件组件提供了标准化 API&#xff0c;从而为用户和软件行业…

6个最好实践指导您快速部署YashanDB

数据库技术在现代信息系统中扮演着核心角色&#xff0c;面对性能瓶颈、数据一致性和高可用性等普遍挑战&#xff0c;选择一款高效、稳定且易管理的数据库方案显得尤为重要。YashanDB凭借其灵活的部署架构和强大的功能组件&#xff0c;成为满足多样业务需求的理想选择。本文将系…

数据编织创新脉络:知识图谱在科技成果转化中的应用与价值探索

科易网AI技术转移与科技成果转化研究院在当今科技创新日新月异的时代&#xff0c;科技成果的转化与应用已成为衡量一个地区乃至国家创新能力的重要标尺。然而&#xff0c;科技成果转化路径复杂、信息不对称、资源匹配难等问题&#xff0c;长期制约着创新链与产业链的有效对接。…

【挖掘Windows这三个隐藏工具】

挖掘Windows这三个隐藏工具&#xff0c;解决90%的疑难杂症 当系统出问题时&#xff0c;多数人会重启或重装。但掌握下面三个工具&#xff0c;你能像专业工程师一样精准定位和修复问题。 1. 可靠性监视器&#xff1a;系统健康的“时间胶囊” 你肯定用过事件查看器&#xff0c;但…

阿西米尼Asciminib治疗慢性髓系白血病的深度分子学反应与疗程依赖性分析

慢性髓系白血病&#xff08;CML&#xff09;作为一种骨髓增殖性肿瘤&#xff0c;其治疗一直是血液学领域的重点。阿西米尼&#xff08;Asciminib&#xff09;作为全球首个STAMP抑制剂&#xff0c;通过靶向ABL肉豆蔻酰口袋抑制BCR-ABL1激酶活性&#xff0c;为CML患者提供了新的治…

机器人质量与成本控制十年演进

下面给你一条从工程系统、产业落地与长期治理出发的 「机器人质量与成本控制十年演进路线&#xff08;2025–2035&#xff09;」。 我会把重点放在**“控制”如何演进**&#xff0c;而不是单纯的质量或成本指标。一、核心判断&#xff08;一句话&#xff09;未来十年&#xff0…

7大关键因素保障YashanDB数据库的稳定性

在现代业务环境中&#xff0c;数据库的稳定性对于保障服务的连续性和数据的正确性至关重要。如何确保数据库系统的稳定运行&#xff0c;避免性能瓶颈、数据丢失以及故障中断&#xff0c;是企业数据库管理的重要课题。本文基于行业技术实践&#xff0c;从YashanDB数据库的架构与…

2026短剧业务研判

2026短剧业务研判一、核心结论&#xff08;给管理层/负责人看的 1 页版信息密度&#xff09; 结论1&#xff1a;2026短剧的胜负手从“押题材”转向“做系统”。 题材仍重要&#xff0c;但不会再是决定性变量。决定性变量是&#xff1a;你能否把短剧当成一套可复制的工程——内容…