全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

在 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 
#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 被销毁时,对象才会被释放。

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

基本用法:

  • 通过 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,优先让智能指针接管资源管理。


# node  # ai  # c++  # ios  # stream  # 作用域  # red  # 循环  # 指针  # delete  # 对象  # 多个  # 动态分配  # 也会  # 零时  # 才会  # 当你  # 推荐使用  # 只是一个  # 主要包括  # 为空 


相关文章: 建站之星如何快速更换网站模板?  北京网站制作网页,网站升级改版需要多久?  建站主机与虚拟主机有何区别?如何选择最优方案?  建站之星Pro快速搭建教程:模板选择与功能配置指南  已有域名和空间如何快速搭建网站?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  内网网站制作软件,内网的网站如何发布到外网?  高防服务器租用如何选择配置与防御等级?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  如何在阿里云完成域名注册与建站?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  北京制作网站的公司,北京铁路集团官方网站?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  如何设计高效校园网站?  南京网站制作费用,南京远驱官方网站?  C#如何在一个XML文件中查找并替换文本内容  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  c# 服务器GC和工作站GC的区别和设置  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  如何快速搭建支持数据库操作的智能建站平台?  微信小程序 五星评分(包括半颗星评分)实例代码  已有域名和空间如何搭建网站?  如何在搬瓦工VPS快速搭建网站?  专业商城网站制作公司有哪些,pi商城官网是哪个?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  如何用腾讯建站主机快速创建免费网站?  如何在阿里云虚拟主机上快速搭建个人网站?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  C++用Dijkstra(迪杰斯特拉)算法求最短路径  定制建站模板如何实现SEO优化与智能系统配置?18字教程  如何快速上传自定义模板至建站之星?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  javascript基本数据类型及类型检测常用方法小结  建站之星如何实现PC+手机+微信网站五合一建站?  学校建站服务器如何选型才能满足性能需求?  如何快速搭建高效服务器建站系统?  Python路径拼接规范_跨平台处理说明【指导】  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  学校为何禁止电信移动建设网站?  建站之星安装需要哪些步骤及注意事项?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  建站与域名管理如何高效结合?  如何批量查询域名的建站时间记录?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  建站VPS推荐:2025年高性能服务器配置指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。