智能指针 std::auto_ptr 和 shared_ptr

从0到1打造工业级上位机:通信协议到架构设计的实战全流程 作为一名在工控领域摸爬滚打十余年的开发者,前阵子刚帮一家新能源工厂完成了一套工业上位机系统的从0到1搭建。从最初和PLC通信联调时的“连不上、传错数”,到最终系统7×24小时稳定运行,踩过的坑、攒下的实战经验,今天就毫无保留地拆解给各位同行。这篇文章会从通信层、数据层、UI层到架构层逐层深入,全是工业现场验证过的干货,新手也能跟着落地。 阅读详情
auto_ptr 类可以用于管理由 new 分配的单个对象,但是无法管理动态分配的数组(我们通常不会使用数组,而是使用 vector 代替数组)。auto_ptr 在拷贝和赋值的时候有不寻常的行为,因此 auto_ptrs 不能被保存在 stl 的容器中。当 auto_ptr 离开了自己的作用域或者被销毁,由 auto_ptr 管理的对象也会被销毁。
使用std::auto_ptr需要的头文件: #include <memory>
// 示例 1(b): 安全代码, 使用了auto_ptr
 void f()
 {
   auto_ptr<T> pt( new T );
        .....
 } // 酷: 当pt出了作用域时析构函数被调用,从而对象被自动删除

  现在代码不会泄漏T类型的对象,不管这个函数是正常退出还是抛出了异常,因为pt的析构函数总是会在出栈时被调用。清理会自动进行。
  最后,使用一个auto_ptr就像使用一个内建的指针一样容易,而且如果想要“撤销”资源,重新采用手动的所有权,我们只要调用release().

   // 示例 2: 使用一个 auto_ptr
   void g()
   {
   T* pt1 = new T;   // 现在,我们有了一个分配好的对象
     auto_ptr<T> auto_pt2( pt1 ); // 将所有权传给了一个auto_ptr对象,auto_pt2 指向了 pt1

   // 使用auto_ptr就像我们以前使用简单指针一样
   auto_pt2 = 12; // 就像 "*pt1 = 12;"
   auto_pt2->SomeFunc(); // 就像 "pt1->SomeFunc();"

   // 用get()来获得指针的值
   assert( pt1 == auto_pt2.get() );   // 二者一样
   // 用release()来撤销所有权, auto_pt2 把保存的指针地址给了pt3, 而自己指向了NUll。
   T* pt3 = auto_pt2.release();   //
   // 自己删除这个对象,因为现在没有任何auto_ptr拥有这个对象
   delete pt3;
   } // pt2不再拥有任何指针,所以不要试图删除它...ok,不要重复删除

  最后,我们可以使用auto_ptr的reset()函数来重置auto_ptr使之拥有另一个对象。如果这个auto_ptr已经拥有了一个对象,那么,它会先删除已经拥有的对象,因此调用reset()就如同销毁这个auto_ptr,然后新建一个并拥有一个新对象:
   // 示例 3: 使用reset()
   //
   void h()
   {
   auto_ptr<T> pt( new T(1) );
   pt.reset( new T(2) );   //即pt会首先delete pt目前指向的地址(new T(1)得到的地址),
                                                       //然后再指向new T(2)分配的地址
   } // 最后,pt出了作用域,
   // 第二个T也被自动删除了
 
boost::scoped_ptr虽然简单易用,但它不能共享所有权的特性却大大限制了其使用范围,而 boost::shared_ptr可以解决这一局限。顾名思义,boost::shared_ptr是可以共享所有权的智能指针,首先让我们通过一个例子看看它的基本用法:
#include <string>
#include
 <iostream>
#include
 <boost/shared_ptr.hpp>

class implementation
{
public:
    ~implementation() { std::cout <<"destroying implementation\n"; }
    void do_something() { std::cout << "did something\n"; }
};

void test()
{
    boost::shared_ptr<implementation> sp1(new implementation());
    std::cout<<"The Sample now has "<<sp1.use_count()<<" references\n";

    boost::shared_ptr<implementation> sp2 = sp1;
    std::cout<<"The Sample now has "<<sp2.use_count()<<" references\n";
    
    sp1.reset();
    std::cout<<"After Reset sp1. The Sample now has "<<sp2.use_count()<<" references\n";

    sp2.reset();
    std::cout<<"After Reset sp2.\n";
}

void main()
{
    test();
}
该程序的输出结果如下:
The Sample now has 1 references
The Sample now has 2 references
After Reset sp1. The Sample now has 1 references
destroying implementation
After Reset sp2.
可以看到,boost::shared_ptr指针sp1和sp2同时拥有了 implementation对象的访问权限,且当sp1和sp2都释放对该对象的所有权时,其所管理的的对象的内存才被自动释放。在共享对象的访问权限同时,也实现了其内存的自动管理。
boost::shared_ptr的内存管理机制:
boost::shared_ptr的管理机制其实并不复杂,就是对所管理的对象进行了引用计数,当新增一个boost::shared_ptr对该对象进行管理时,就将该对象的引用计数加一;减少一个boost::shared_ptr对该对象进行管理时,就将该对象的引用计数减一,如果该对象的引用计数为0的时候,说明没有任何指针对其管理,才调用delete释放其所占的内存。
上面的那个例子可以的图示如下:
  1. sp1对implementation对象进行管理,其引用计数为1
  2. 增加sp2对implementation对象进行管理,其引用计数增加为2
  3. sp1释放对implementation对象进行管理,其引用计数变为1
  4. sp2释放对implementation对象进行管理,其引用计数变为0,该对象被自动删除
boost::shared_ptr的特点:
和前面介绍的boost::scoped_ptr相比,boost::shared_ptr可以共享对象的所有权,因此其使用范围基本上没有什么限制(还是有一些需要遵循的使用规则,下文中介绍),自然也可以使用在stl的容器中。另外它还是线程安全的,这点在多线程程序中也非常重要。
boost::shared_ptr的使用规则:
boost::shared_ptr并不是绝对安全,下面几条规则能使我们更加安全的使用boost::shared_ptr:
  1. 避免对shared_ptr所管理的对象的直接内存管理操作,以免造成该对象的重释放
  2. shared_ptr并不能对循环引用的对象内存自动管理(这点是其它各种引用计数管理内存方式的通病)。
  3. 不要构造一个临时的shared_ptr作为函数的参数。
    如下列代码则可能导致内存泄漏:
    void test()
    {
        foo(boost::shared_ptr<implementation>(new    implementation()),g());
    }
    正确的用法
    为 :
    void test()
    {
        boost::shared_ptr<implementation> sp    (new implementation());
        foo(sp,g());
    }



    2011-07-07 22:39:32
    如下列代码则可能导致内存泄漏:
    void test()
    {
      foo(boost::shared_ptr<implementation>(new   implementation()),g());
    }
    正确的用法为:
    void test()
    {
      boost::shared_ptr<implementation> sp   (new implementation());
      foo(sp,g());
    }
    您好博主,上面代码会导致内存泄露?能更深入的分析一下,导致内存泄露的原因么?
    期待中...

YOLOv8改进 | 主干篇 | 利用MobileNetV1替换Backbone(轻量化网络结构) 本文给大家带来的改进机制是MobileNetV1,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其引入了两个简单的全局超参数,用于在延迟和准确性之间进行有效的权衡。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性,这个模型非常适合轻量化的读者来使用。适用检测目标:轻量化网络结构适合轻量化的读者。 阅读详情

相关推荐

RTX4090上跑CenterNet训练

参考实现 url=https://github.com/xingyizhou/CenterNet.git commit_id=5b1a490a52da57d3580e80b8bb4bbead9ef2af96

遗失的神庙 1621

基础知识 四种智能指针

C++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被11弃用。 为什么要使用智能指针: 智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数...

pkuxuan的博客 1321

Ubuntu22.04中通过conda快速部署PyTorch开发环境(CPU/GPU双版本实战)

本文详细介绍了在Ubuntu22.04系统中,如何利用Conda高效部署PyTorch开发环境。文章分别提供了CPU与GPU双版本的实战教程,涵盖环境创建、镜像加速、版本匹配及深度验证等关键步骤,旨在帮助开发者快速搭建稳定、兼容的深度学习环境,从而专注于模型开发。

rose2的博客 555

C++智能指针:auto_ptr、unique_ptr、shared_ptr、weak_ptr

智能指针:auto_ptr、unique_ptr、shared_ptr、weak_ptr

m0_49328056的博客 1396

win11禁止更新,草履虫教程

本文介绍了彻底禁止Windows 11系统更新的组合方法,包括禁用核心服务、修改注册表、关闭计划任务和使用组策略(专业版适用)。作者特别提醒,禁止更新会影响系统安全性,建议实体机保持更新,仅虚拟机等特殊情况下使用这些方法。同时强调即使禁用更新,也应定期手动检查重要安全补丁。文章最后附上了作者的个人网站信息。

testwzc1的博客 558

关于使用vcpkg下载osgearth遇到的问题

注意--x-manifest-root=后面跟着的E:\gitproject\osgearth-osgearth-3.5\vcpkg是你下载的源码解压缩后vcpkg.json的文件地址,然后等待编译完成。安装vcpkg后使用vcpkg install osgearth:x64-windows安装好osgearth并且导入项目使用时,发现无法运行官方文档中示例的main.cpp。这里写一种自己用过的使用vcpkg安装osgearth3.5的方法,源码,打开vcpkg所在的命令行,执行。示例main.cpp。

m0_61776040的博客 1523

C++智能指针详解(auto_ptr、unique_ptr、shared_ptr)

智能指针的应用场景、智能指针的介绍、智能指针的使用与原理、auto_ptr、unique_ptr、shared_ptr、shared_ptr与线程安全、shared_ptr的循环引用、weak_ptr解决循环引用、智能指针与定制删除器、lock与RAII、内存泄漏

wuqiongjin的博客 2560

STM32F103 实例应用(10)——I2C读写24C32

一、应用简介 本文介绍24C32的读写,基于野火的软件I2C程序。 board_i2c.h /**=========================================================================== @file board_i2c.h @brief 本文件是用于I2C驱动 @author 青梅煮久 @version r0.1 @date 2021/01/13 -------------------------.

qq_34118600的博客 3447

c++ 之四大智能指针 std::auto_ptr std::shared_ptr std::unuque std::weak_ptr 比较总结

1. 动态内存必要性 程序不知道自己需要多少对象;  程序不知道对象的准确类型;  程序需要在多个对象之间共享数据; 2. 动态内存在哪里 程序有静态内存、栈内存。静态内存用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量。栈内存用来保存定义在函数内的非static对象。分配在静态或栈内存中的对象由编译器自动创建或销毁。对于栈对象,仅在其定义的程序块运行时才存在...

学之知之的博客 2410

Android Binder的两三事--基于Android14源码

Android14-Framework-Binder

保持专注,保持热爱 1140

如何用DeepSeek写年底工作总结?——从入门到精通的全流程指南

AI助手DeepSeek如何高效撰写工作总结 摘要:本文介绍如何利用DeepSeek智能AI助手高效完成工作总结写作。工作总结具有结构固定、语言规范、内容数据化三大特性,而DeepSeek的结构化生成、风格适配、数据整合和迭代优化四大核心能力与之完美匹配。文章提出"准备-搭架-填充-优化"四步工作法:1)精准输入岗位、时间范围等核心信息;2)先搭建逻辑清晰的提纲框架;3)分模块填充具体内容,突出数据与案例;4)通过风格润色和细节补充进行优化。通过合理运用多模态材料处理能力,DeepSee

通俗易懂学IT 285

浅谈智能指针工作原理(std::shared_ptr、std::unique_ptr、std::weak_ptr、std::auto_ptr)

智能指针,老有人会问关于对它的认识。为了很好的回答这个问题。对智能指针 std::shared_ptr、std::unique_ptr、std::weak_ptr和 std::auto_ptr进行分析。在此做一个总结,对于智能指针的分析告一段落。`智能指针总是八股文的一部分,与其记住它的特性,不如知道它的工作逻辑,推导出所以然。记性总是很差,为何不去理解它的原理,感受它的趣味。

qq_39884728的博客 1178

二极管钳位电路、限幅电路和检波电路Multisim电路仿真

本文系统介绍了二极管钳位、限幅和检波三种基础电路的工作原理及Multisim仿真验证。钳位电路通过电容-二极管配合实现波形整体平移,将波峰或波谷固定在指定电压;限幅电路利用二极管导通特性削除信号超出设定阈值的部分;检波电路则通过半波整流和电容滤波从调幅波中提取音频信号。三种电路均通过Multisim仿真验证了理论分析结果,展示了二极管在信号处理中的关键作用。这些基础电路广泛应用于信号调理、电平保护和通信解调等领域。

XU157303764的博客 1118

智能指针std::auto_ptr和tr1:shared_ptr用法

下面通过一个工厂函数(createInvestment())返回一个特定的investment对象: Investment* createInvestment();   见如下函数: void f() {     Investment* pInv = createInvestment();     ....     delete pInv; }

alibo2008的专栏 694

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

深入理解C++智能指针:从std::auto_ptr到现代C++的演进

通过合理选择和使用这些智能指针,你可以编写出更安全、更高效的C++代码。std::auto_ptr 已经被废弃,不应该在新代码中使用。std::unique_ptr 是最轻量级且高效的智能指针,适用于单一所有权的情况。std::shared_ptr 提供了灵活的所有权管理和线程安全性,但在性能上有所牺牲,并需要注意循环引用的风险。std::weak_ptr 主要用来辅助std::shared_ptr,以避免循环引用问题。

evesmith520的博客 1254

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【C++】智能指针

💬 hello!各位铁子们大家好哇。今日更新了C++智能指针的相关内容。

qinjh_的博客 3906

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

智能指针std::auto_ptr和tr1:shared_ptr用法(总结的最好的一篇)

下面通过一个工厂函数(createInvestment())返回一个特定的investment对象: Investment* createInvestment();   见如下函数: void f() {     Investment* pInv = createInvestment();     ....     delete pInv; }

靖哥哥的专栏 879

C++进阶--C++11智能指针

智能指针不是指针,是一个管理指针的类,用来存储指向动态分配对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏。动态分配的资源,交给一个类对象去管理,当类对象生命周期结束时,自动调用析构函数释放资源。RAII是resource acquisition is initialization的缩写,意为“资源获取即初始化”。它是 C++ 之父 Bjarne Stroustrup 提出的设计理念,其核心是把资源和对象的生命周期绑定,对象创建获取资源,对象销毁释放资源。

sushang的博客 6194

【C++】智能指针&&RALL&&实现shared_ptr

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。// 1.内存申请了忘记释放// 2.异常安全问题Func();// 这里Func函数抛异常导致 delete[] p3未执行,p3没被释放.

zxctsclrjjjcph的博客 1315

C++11 智能指针,unique_ptr,shared_ptr以及weak_ptr

C++11 智能指针,unique_ptr,shared_ptr以及weak_ptr

2301_77509762的博客 1199

C++智能指针完全指南:从std::auto_ptr到现代智能指针实践

C++智能指针演进与使用指南 本文系统介绍了C++智能指针的发展历程和核心用法。首先分析了被废弃的std::auto_ptr的所有权转移缺陷,进而深入讲解三种现代智能指针:std::unique_ptr用于独占所有权场景,支持移动语义和自定义删除器;std::shared_ptr实现共享所有权,但需警惕循环引用问题;std::weak_ptr作为观察者指针打破循环引用。文章还对比了各类智能指针的性能开销,并给出工厂函数规范、前置声明优化等实践建议。现代C++智能指针遵循RAII原则,可以有效管理90%的内存

AlgoCraft 939

C++智能指针

实现智能指针时需要考虑以下三个方面的问题:1. 在对象构造时获取资源,在对象析构的时候释放资源,利用对象的生命周期来控制程序资源,即RAII特性。2. 对*和->运算符进行重载,使得该对象具有像指针一样的行为。3. 智能指针对象的拷贝问题。概念说明:RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、互斥量等等)的简单技术。

2021dragon的博客 7565

智能指针详解

介绍C++智能指针的使用以及注意事项

心愿许得无限大 1079

auto_ptr 与 shared_ptr 用法和区别总结

一、std::auto_ptr 被复制后,将失去原来所致资源的所有权;*auto_ptr在头文件<memory>中。 永不建立auto_ptr的容器 关于此可以看的Effective STL的条款8 因为auto_ptr并不是完美无缺的,它的确很方便,但也有缺陷,在使用时要注意避免。 首先,不要将auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做,否则可能会碰到不...

大隐隐于野 2019
上一篇: 剖析C++标准库智能指针(std::auto_ptr)
ShenRui
博客等级 码龄20年 63粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值