新闻中心

C++ 如何使用智能指针 (shared_ptr, unique_ptr)_C++ 智能指针用法与内存管理

2025-11-26
浏览次数:
返回列表
C++11引入智能指针解决内存管理问题,unique_ptr独占所有权并自动释放资源,shared_ptr通过引用计数实现共享所有权,weak_ptr打破循环引用,推荐使用make_unique和make_shared创建智能指针以提升安全性。

c++ 如何使用智能指针 (shared_ptr, unique_ptr)_c++ 智能指针用法与内存管理

在 C++ 中,手动管理内存容易引发内存泄漏、重复释放等问题。为了解决这些问题,C++11 引入了智能指针,主要包括 std::unique_ptrstd::shared_ptr,它们能自动管理动态分配的对象生命周期,确保资源安全释放。

std::unique_ptr:独占所有权的智能指针

std::unique_ptr 表示对对象的独占所有权,同一时间只能有一个 unique_ptr 指向某个对象。当 unique_ptr 被销毁时,它所管理的对象也会被自动删除。

使用场景:当你需要动态分配对象且不希望多个指针共享该对象时,应优先使用 unique_ptr。

基本用法:

  • 通过 std::make_unique 创建(C++14 起推荐方式)
  • 不能复制,但可以移动(move)
  • 离开作用域时自动释放内存
#include <memory>
#include <iostream>

int main() {
    auto ptr = std::make_unique<int>(42);
    std::cout << *ptr << "\n"; // 输出 42

    // 移动所有权
    auto ptr2 = std::move(ptr);
    // 此时 ptr 为空,ptr2 拥有对象

    return 0;
} // ptr2 离开作用域,自动 delete

std::shared_ptr:共享所有权的智能指针

std::shared_ptr 实现引用计数机制,多个 shared_ptr 可以共享同一个对象。只有当最后一个 shared_ptr 被销毁时,对象才会被释放。

使用场景:多个模块或函数需要共享同一个对象时使用。

美图云修 美图云修

商业级AI影像处理工具

美图云修 50 查看详情 美图云修

基本用法:

  • 通过 std::make_shared 创建(更高效)
  • 支持拷贝,每拷贝一次引用计数加一
  • 引用计数归零时自动释放资源
#include <memory>
#include <iostream>

void use_ptr(std::shared_ptr<int> p) {
    std::cout << "引用计数: " << p.use_count() << "\n";
}

int main() {
    auto sptr = std::make_shared<int>(100);
    std::cout << "初始引用计数: " << sptr.use_count() << "\n";

    {
        auto sptr2 = sptr; // 引用计数 +1
        std::cout << "复制后引用计数: " << sptr.use_count() << "\n";
        use_ptr(sptr2); // 再次增加临时引用
    } // sptr2 销毁,引用计数 -1

    return 0;
} // sptr 销毁,引用计数归零,释放内存

避免循环引用:使用 weak_ptr

当两个 shared_ptr 相互持有对方时,会导致引用计数无法归零,形成内存泄漏。这时应使用 std::weak_ptr 打破循环。

weak_ptr 不增加引用计数,只是一个“观察者”,访问前需检查对象是否还存在。

#include <memory>
struct Node {
    std::shared_ptr<Node> parent;
    std::weak_ptr<Node> child; // 避免循环引用
};

auto node1 = std::make_shared<Node>();
auto node2 = std::make_shared<Node>();
node1->child = node2;
node2->parent = node1; // 形成父子关系,但 child 是 weak_ptr
// 正常析构,不会泄漏

基本上就这些。合理使用 unique_ptr 和 shared_ptr,配合 make_unique / make_shared,能极大提升代码安全性与可维护性。注意避免裸 new/delete,优先让智能指针接管资源管理。

以上就是C++ 如何使用智能指针 (shared_ptr, unique_ptr)_C++ 智能指针用法与内存管理的详细内容,更多请关注其它相关文章!


# 客户端  # 传奇手游推广的网站  # 吉林正规网站建设检修  # 网站建设需办理什么证  # 寻甸抖音营销推广找谁  # 辽宁模板网站推广  # 品牌网站建设详细方案  # seo网站推广的目的找圣安华  # 自动seo系统  # 国外节日营销推广方案  # 衬衫线上营销推广方案  # 也会  # 动态分配  # 解决了  # 内存管理  # 什么问题  # 解决方法  # 如何使用  # 多个  # 美图  # red  # 作用域  # stream  # ios  # c++  # ai  # node  # c++智能指针 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: zookeeper 都有哪些功能?  J*aScript生成器_j*ascript异步迭代  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  我的世界官方游戏入口 我的世界官网平台直达链接  msn官网入口地址手机版 msn官方网站手机最新链接  如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构  cad如何更改注释性对象的比例_cad注释性比例调整方法  KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法  晋江读书网页版在线登录 晋江读书电脑版官网  excel怎么制作工资条 excel快速生成工资条的方法  SteamMachine定价或为699美元 大家想入手吗?  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!  学习通网页版官方登录 超星学习通电脑端入口指南  Pandas DataFrame:高效添加条件计算列  outlook中文官网入口地址 outlook官方中文版直达首页链接  Lar*el DB::listen 事件中的查询执行时间单位解析  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  精准捕获:如何在页面中监听除特定元素外的所有点击事件  小米汽车11月交付量突破40000台!雷军:将继续努力  铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则  如何在Promise链中有效终止错误处理后的执行  解决Bootstrap卡片顶部边距导致背景图下移的问题  向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程  如何使用Node.js csv 包按条件移除含空字段的CSV记录  实现全屏滚动与导航点:专业教程  微博网页版直接访问 微博网页版账号管理快速入口  NetBeans Ant项目:自动化将资源文件复制到dist目录的教程  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】  sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE  解决 MongoDB 聚合查询中对象数组 _id 匹配问题  如何在Python中使用Optional类型处理可变对象并避免Pylint警告  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】  德邦快递查询平台 德邦快递物流信息查询入口  漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道  免费抖音短视频入口_抖音网页版短视频免费通道  我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口  steam官方入口大全 steam账号注册及操作指南  汽水音乐在线解析 汽水音乐在线解析入口  不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|  包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接  AO3最新官网入口公告_2025AO3镜像站实时查询方法  马斯克:Optimus 人形机器人复数形式为 Optimi  2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  Lar*el 8 多关键词数据库搜索优化实践  J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  css绝对定位元素脱离父容器怎么办_确保父元素position非static 

搜索