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

C++智能指针简介

什么是智能指针?

智能指针就像你的"智能小管家",帮你自动管理内存,不用再担心忘记释放内存导致泄漏的问题。

三种常用智能指针

unique_ptr - 唯一管家

• 特点:一个对象只能有一个管家

• 不能复制,但可以"交接"(移动)

#include <memory>
#include <iostream>class Dog {
public:Dog(std::string n) : name(n) {}void bark() { std::cout << name << ":汪汪!" << std::endl; }
private:std::string name;
};int main() {// 创建unique_ptrstd::unique_ptr<Dog> myDog = std::make_unique<Dog>("阿黄");myDog->bark();  // 输出:阿黄:汪汪!// 不能这样复制!(报错)// auto otherDog = myDog; // 但可以这样"交接"(移动)auto newOwner = std::move(myDog);if(!myDog) {std::cout << "原主人已经没有狗了" << std::endl;}newOwner->bark();  // 输出:阿黄:汪汪!
}

shared_ptr - 共享管家

• 特点:多个管家可以共同照顾同一个对象

• 通过计数知道有多少个管家在管理

#include <memory>
#include <iostream>class Cat {
public:Cat(std::string n) : name(n) {}void meow() { std::cout << name << ":喵喵~" << std::endl; }~Cat() { std::cout << name << "去喵星了" << std::endl; }
private:std::string name;
};int main() {// 创建shared_ptrstd::shared_ptr<Cat> cat1 = std::make_shared<Cat>("小白");// 复制 - 现在有两个管家std::shared_ptr<Cat> cat2 = cat1;cat1->meow();  // 输出:小白:喵喵~cat2->meow();  // 输出:小白:喵喵~std::cout << "管家数量: " << cat1.use_count() << std::endl;  // 输出:2// 当一个管家离开cat1.reset();std::cout << "现在管家数量: " << cat2.use_count() << std::endl;  // 输出:1
} 
// cat2离开时输出:小白去喵星了

weak_ptr - 观察员管家

• 特点:只观察不管理,不影响对象生命周期

• 需要时可以临时"转正"成shared_ptr

#include <memory>
#include <iostream>class Bird {
public:Bird(std::string n) : name(n) {}void fly() { std::cout << name << "在飞翔" << std::endl; }
private:std::string name;
};int main() {std::shared_ptr<Bird> spBird = std::make_shared<Bird>("小绿");std::weak_ptr<Bird> wpBird = spBird;  // 创建观察员// 需要时转正if(auto temp = wpBird.lock()) {temp->fly();  // 输出:小绿在飞翔}spBird.reset();  // 主人不要鸟了if(wpBird.expired()) {std::cout << "小鸟已经飞走了" << std::endl;}
}

如何复制智能指针?

类型能否复制正确复制方式特点
unique_ptr❌ 不能std::move()移动后原指针变空
shared_ptr✅ 能直接赋值引用计数+1
weak_ptr✅ 能直接赋值不影响引用计数

建议

  1. 优先用make_uniquemake_shared创建
  2. 默认先用unique_ptr,需要共享再用shared_ptr
  3. 两个类互相包含时,记得用weak_ptr避免循环引用

备注

个人能力有限,有问题随时交流~~

相关文章:

  • Dagster中的Ops与Assets:数据管道构建的两种选择
  • C语言中的自定义类型 —— 结构体.位段.联合体和枚举
  • 深入理解Redis SDS:高性能字符串的终极设计指南
  • 用PyTorch搭建卷积神经网络实现MNIST手写数字识别
  • 《ATPL地面培训教材13:飞行原理》——第3章:基础空气动力学理论
  • 广义线性模型三剑客:线性回归、逻辑回归与Softmax分类的统一视角
  • 【查看.ipynp 文件】
  • 文献总结:TPAMI端到端自动驾驶综述——End-to-End Autonomous Driving: Challenges and Frontiers
  • 基于Springboot+Mysql的校园博客系统(含LW+PPT+源码+系统演示视频+安装说明)
  • 信息安全导论:解码社会工程学攻击的隐形战争
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】1.1 数据库核心概念与PostgreSQL技术优势
  • 软件工程实践
  • 基于 Dify + vLLM插件 + Qwen3 构建问答机器人Docker版
  • 机器人--MCU
  • MySQL数据操作全攻略:DML增删改与DQL高级查询实战指南
  • Oracle RAC ‘Metrics Global Cache Blocks Lost‘告警解决处理
  • 火语言RPA--DestoonV8商品发布
  • Qt 中实现观察者模式(Observer Pattern)
  • ros2 humble 控制真实机械臂(以lerobot为例)
  • 【Unity】XLua访问C#文件
  • 马上评|演出服“穿过就退货”的闹剧不该一再重演
  • 李云泽:房地产“白名单”贷款审批通过金额增至6.7万亿元
  • 山东滕州一车辆撞向公交站台撞倒多人,肇事者被控制,案件已移交刑警
  • 上海车展侧记|中国汽车产业的韧性从何而来
  • “子宫肌瘤男性病例”论文后:“宫颈癌、高危产妇”论文也现男性病例,作者称“打错了”
  • 李公明 | 一周画记:生活就是抵抗