0

0

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

冰火之心

冰火之心

发布时间:2025-11-26 10:21:07

|

408人浏览过

|

来源于php中文网

原创

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。

基本用法:

立即学习C++免费学习笔记(深入)”;

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

int main() {
    auto ptr = std::make_unique(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 被销毁时,对象才会被释放。

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

HTTPie AI
HTTPie AI

AI API开发工具

下载

基本用法:

立即学习C++免费学习笔记(深入)”;

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

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

int main() {
    auto sptr = std::make_shared(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 
struct Node {
    std::shared_ptr parent;
    std::weak_ptr child; // 避免循环引用
};

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

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

相关专题

更多
数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

266

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.12.29

vlookup函数使用大全
vlookup函数使用大全

本专题整合了vlookup函数相关 教程,阅读专题下面的文章了解更多详细内容。

28

2025.12.30

金山文档相关教程
金山文档相关教程

本专题整合了金山文档相关教程,阅读专题下面的文章了解更多详细操作。

29

2025.12.30

PS反选快捷键
PS反选快捷键

本专题整合了ps反选快捷键介绍,阅读下面的文章找到答案。

25

2025.12.30

表格中一行两行的方法
表格中一行两行的方法

本专题整合了表格中一行两行的相关教程,阅读专题下面的文章了解更多详细内容。

4

2025.12.30

cpu温度过高解决方法大全
cpu温度过高解决方法大全

本专题整合了cpu温度过高相关教程,阅读专题下面的文章了解更多详细内容。

5

2025.12.30

ASCII码介绍
ASCII码介绍

本专题整合了ASCII码相关内容,阅读专题下面的文章了解更多详细内容。

31

2025.12.30

GPS是什么
GPS是什么

本专题整合了GPS相关内容,阅读专题下面的文章了解更多详细内容。

5

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.3万人学习

MySQL 教程
MySQL 教程

共48课时 | 1.5万人学习

麻省理工大佬Python课程
麻省理工大佬Python课程

共34课时 | 5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号