Boost Smart Pointers 智能指針

C++ Boost库实战指南:从安装部署到核心库应用与避坑 C++标准库为开发者提供了基础的数据结构和算法支持,但其功能在特定领域如网络编程、文件系统操作和高级内存管理上存在局限。为了填补这些空白并提升开发效率,Boost库应运而生,它作为C++标准库的扩展与试验田,通过提供大量经过同行评审、可移植的组件,极大地增强了C++的工程实践能力。其技术价值在于,它不仅为现代C++标准(如C++11/14/17)的诸多特性(如智能指针、线程库)提供了先行实现,还包含了大量标准库尚未涵盖的实用工具,如异步I/O框架Asio和跨平台文件系统库Filesystem。在应用场景上, 阅读详情
 

boost.png (6897 bytes)Smart Pointers 智能指針

转载:http://boost.ez2learn.com/libs/smart_ptr/smart_ptr.htm

Introduction 簡介
Common Requirements 共同需求
Exception Safety 異常安全
Exception-specifications 異常規範
History and Acknowledgements 歷史和感謝
References 參考資料

Introduction 簡介

smart pointers(智能指針)是存儲“指向動態分配(在堆上)的對象的指針”的對象。他們的行為很像 C++ 的內建指針,只是它們可以在適當的時候自動刪除它們所指向的對象。智能指針在面對異常時有非常顯著的作用,它們可以確保動態分配對象的完全析構。它們還可以用於跟蹤多主人共享的動態分配對象。

在概念上,智能指針可以看作擁有它所指向的對象,並因此在對像不再需要時負責將它刪除。

智能指針庫提供五個(原文是五個,我數著怎麼是六個呢?暈——譯者注)智能指針類模板:

scoped_ptr<boost/scoped_ptr.hpp>簡單的單一對象的唯一所有權。不可拷貝。
scoped_array<boost/scoped_array.hpp>簡單的數組的唯一所有權。不可拷貝。
shared_ptr<boost/shared_ptr.hpp>在多個指針間共享的對象所有權。
shared_array<boost/shared_array.hpp>在多個指針間共享的數組所有權。
weak_ptr<boost/weak_ptr.hpp>一個屬於 shared_ptr 的對象的無所有權的觀察者。
intrusive_ptr<boost/intrusive_ptr.hpp>帶有一個侵入式引用計數的對象的共享所有權。

這些模板被設計用來補充 std::auto_ptr 模板的不足。

它們是在 Bjarne Stroustrup 的 "The C++ Programming Language" 第三版,14.4,資源管理部分描述的 "resource acquisition is initialization"(“獲得資源就是初始化”,《C++ 程序設計語言》中文版中譯為“資源申請即初始化”,個人認為不太確切——譯者注)慣用法的實例。

測試程序 smart_ptr_test.cpp,用來檢驗正確的操作。

網頁 compatibility(兼容性)結合 Boost 智能指針庫的老版本記述了智能指針實現的早期版本以來的一些變化。

網頁 smart pointer timings(智能指針測時)專注於那些犄角旮旯的性能問題。

網頁 smart pointer programming techniques(智能指針編程技術)列舉了shared_ptr 和 weak_ptr 的一些高級應用。

Common Requirements 共通需求

這些智能指針類模板有一個模板參數 T,它指定這個智能指針所指向的對象的類型。如果類型為 T 的對象的析構函數或operator delete 拋出異常,則智能指針模板的行為是未定義的。

在智能指針聲明的時候,T 可以是一個不完整的類型。除非另外指定,在智能指針實例化的時候,它要求 T 是一個完整的類型。實現體需要診斷出(視為錯誤)所有對這一需求的違例,包括不完整類型的缺失部分。參見checked_delete 函數模板的描述。

注意,shared_ptr 沒有這個限制,它的大部分成員函數都不要求 T 是一個完整的類型。

Rationale 基本原理

T 的需求是要小心謹慎地構造最大化的安全,而且還要允許 handle-body(也可叫做 pimpl(pimpl 全稱為 "pointer to implementation",可參考 Effective C++, 3rd Edition Item 25 29 和 31——譯者注))和其它類似慣用法。在這些慣用法中,一個智能指針可以出現在T 是一個不完整類型的編譯單元中。這樣就從實現中分離出接口,並對僅僅使用接口的編譯單元中隱藏實現。在特定智能指針文檔中記述的示例闡明了智能指針在這些慣用法中的應用。

注意,在析構的時候,scoped_ptr 要求 T 是一個完整類型,而 shared_ptr 並不要求。

Exception Safety 異常安全

這些智能指針類中的幾個函數被指定為在拋出異常時“沒有影響”或“除了如此這般之外沒有影響”。這就意味著當這些類中的某個對象拋出異常時,整個程序保持在那個引發異常的函數被調用之前的狀態。這等同於保證沒有可發覺的副作用。另一些函數從不拋出異常。那些拋出異常的函數能夠拋出的異常(假設T 符合共通需求)也僅限於std::bad_alloc,而且也僅限於那些在文檔中明確記述可能拋出 std::bad_alloc 的那些函數。

Exception-specifications 異常規範

沒有使用異常規範,參見 exception-specification rationale。

所有的智能指針模板都包含從不拋出異常的成員函數,因為他們不僅自己從不拋出異常,而且他們調用的其它函數也不會拋出異常。這樣的函數被標示為這樣的註釋:// never throws。

摧毀所指向對象的類型的函數被共同需求禁止拋出異常。

History and Acknowledgements 歷史和感謝

2002 年 1 月。Peter Dimov 重寫了所有四個類,增加特性,修改 bug,而且將它們分開到四個單獨的頭文件中,並增加了 weak_ptr。關於這些更改的概要參見compatibility 網頁。

2001 年 5 月。Vladimir Prus 建議在析構時需要一個完整類型。討論了一些優雅的改進,包括 Dave Abrahams, Greg Colvin, Beman Dawes, Rainer Deyke, Peter Dimov, John Maddock, Vladimir Prus, Shankar Sai,還有其他人。

1999 年 11 月。Darin Adler 提供了 operator ==, operator !=, andstd::swap 和 std::less 的針對 shared 類型的特化。

1999 年 9 月。Luis Coelho 提供了 shared_ptr::swap 和 shared_array::swap。

1999 年 5 月。在 1999 年 4 月和 5 月,Valentin Bonnard 和 David Abrahams 提出大量建議而導致重大改進。

1998 年 10 月。Beman Dawes 提議復原 safe_ptr 和 counted_ptr 名字之下的原有語義,參加會議的有 Per Andersson, Matt Austern, Greg Colvin, Sean Corfield, Pete Becker, Nico Josuttis, Dietmar Kühl, Nathan Myers, Chichiang Wan 和 Judy Ward。經過討論,四個新的類名稱塵埃落定,並決定不需要嚴格遵循std::auto_ptr 的接口,並最終敲定了各個不同函數的標識和語義。

接下來的三個月中,shared_ptr 的幾個實現被提出來,並在 boost.org 郵件列表中進行討論。實現的爭論點始終圍繞著必須被堅持的引用計數,究竟是將它附加到所指向的對象上,還是分離到別處。這些不同本身又各自包含兩種較大的變化:

  • 直接分離:shared_ptr 包含一個指向對象的指針和一個指向數量的指針。
  • 間接分離:shared_ptr 包含一個指向輔助對象的指針,那個對象再依次包含一個指向對像和數量的指針。
  • 嵌入式附加:數量是所指向對象的一個成員。
  • 放置式附加:數量的附加經由 operator new 進行控制。

每一種實現技術都有優勢和劣勢。我們測量了直接和間接方法的不同的運行時間,發現至少在 Intel Pentium 芯片上只有極微小的差別。Kevlin Henney 提供了一篇他寫的論文 "Counted Body Techniques"。Dietmar Kühl 提出一個允許用戶選擇他們更喜歡的實現的優雅的模板偏特化技術,並進行了實驗。

但是 Greg Colvin 和 Jerry Schwarz 認為“參數化會阻礙用戶”,而最終我們選擇僅僅提供直接的實現。

1994 年夏天。Greg Colvin 向 C++ 標準委員會提議名為 auto_ptr 和 counted_ptr 的類,它們和我們現在所說的scoped_ptr 和 shared_ptr 非常相似。[Col-94] 在極少的幾次全體委員會沒有接受庫工作組的建議的案例之一中,counted_ptr 被否決了,並出人意外地將所有權轉讓語義加入到auto_ptr 中。

References 參考資料

[Col-94] Gregory Colvin, Exception Safe Smart Pointers, C++ committee document 94-168/N0555, July, 1994.

[E&D-94] John R. Ellis & David L. Detlefs, Safe, Efficient Garbage Collection for C++, Usenix Proceedings, February, 1994. This paper includes an extensive discussion of weak pointers and an extensive bibliography.

一文吃透 ABAP CDS SELECT:语法全景、关联与去重、可运行示例与实战心法 摘要: 本文深入解析ABAP中CDS视图的SELECT语法,重点介绍两种等价写法、关联与路径表达式优化、DISTINCT去重逻辑及WHERE/GROUP BY/HAVING/UNION等子句的应用。通过可运行的业务伙伴角色去重、关联路径查询及多角色筛选示例,演示如何将CDS特性转化为项目实践。强调关联复用性优于传统JOIN,并指出DISTINCT的权限边界与误用场景,帮助开发者从行式思维转向图式数据建模。(150字) 关键词: ABAP CDS、SELECT语法、路径表达式、DISTINCT去重、关联复用 阅读详情

相关推荐

Veristand simulink 集成 simulink 非正版如何处理

1、安装 veristand model Generation Support add-on。matlab 安装veristand model support 记录。下载 以后 如果非正版matlab 直接拖命令行执行。下载后直接命令行执行即可。

flik9527的博客 598

safe_ptr 智能指针

<br />// ObjGC.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <stdlib.h> #include <memory> #define TRACE printf #define SAFEPTR_TRACE TRACE /* 安全指针(safe_ptr) 不知道叫什么好,就叫这个吧,刚好没跟别的命名冲突 简

杨小卫的专栏 1583

Android车载应用开发:Kotlin与Automotive OS深度实践

Android Automotive OS(AAOS)是Google专为车辆设计的操作系统,直接运行于车机硬件,提供完整的车载信息娱乐系统(IVI)。与Android Auto不同,AAOS允许开发者深度集成车辆硬件功能,如空调控制和传感器数据读取,同时遵循严格的驾驶安全规范。Kotlin作为开发语言,具备空安全设计、扩展函数和协程支持等优势,简化了开发流程。开发环境配置包括Android Studio、AAOS模拟器和Gradle配置,核心组件如CarAppService、Screen与模板系统,以及车辆

时小雨的专栏 3444

安全指针

经过测试: Windows x86_64(MSVS 2013和2015)   Linux x86_64(g ++ 6.3.0和clang 3.8.0)   此代码在在线编译器中:http : //coliru.stacked-crooked.com/a/a97a84ff26c6e9ee 将safe_ptr <>与rw-lock一起使用。 要将安全指针与rw-lock而不是unique-...

asade12345的博客 507

virtualbox虚拟机里面最顶部没有控制、设置和帮助等选项

无意中操作,导致virtualbox虚拟机里面最顶部没有控制,设置和帮助选项  virtualbox虚拟机窗口显示如下如: 如何设置,窗口显示如下图所示呢: virtualbox虚拟机窗口模式显示设置,切换可以通过如下图所示操作进行切换: PS:一定要是右边的Ctrl+C

WEL测试 8780

单细胞测序数据读取实战指南:从入门到精通

本文提供了单细胞测序数据读取的实战指南,涵盖从标准10X Genomics格式到通用表达矩阵及RDS文件的读取方法。文章重点解析了数据读取的核心步骤、常见问题解决方案及进阶技巧,旨在帮助用户夯实数据分析基础,确保后续分析流程的准确性。

weixin_29095587的博客 460

C++标准库(第二版,作者_NicolaiMJosuttis)_第5章通用工具5.2.1shared_ptr

但凡是容器,总是为传入的元素创建属于容器自己的拷贝,所以如果我们直接插入string,插入的其实是string 的拷贝。我们放进去的是一个poiner to string ,因此被复制的也是那些pointer ,于是容器内含有多个“指向同一对象”的reference。,你们公司作为20多年的小公司,研发出来啥啦?声明和赋初值的时候有三种写法,{}、reset()、make_shared() 都可以,哪种都可以。总之,shared_ptr的目标就是在其所指向的对象不再被需要之后,自动释放与对象相关的资源。

只会写HelloWorld的专栏 397

Easy系列PLC远程IO模块的安装配置和地址访问(EtherCAT总线)

EtherCAT分布式时钟DC(SOEM源码解析)EtherCAT分布式时钟DC(SOEM源码解析)_soem dc同步-优快云博客文章浏览阅读1.2k次。分布式时钟(DC,Dsitributed Clock)可以使所有 EtherCAT设备使用相同的系统时间,从而控制各设备任务的同步执行。_soem dc同步1200PLC连接分布式IO组态编程应用(ES200SP固件版本不同解决方法)

RXXW_Dor的博客 175

探索高效的线程安全编程:`safe_ptr`与`contfree_shared_mutex`

在多线程编程中,确保对象的线程安全性是至关重要的,但这也可能导致性能损失。然而,这个名为`object_threadsafe`的开源项目提供了一种革新性的解决方案,通过`safe_ptr`和`contfree_shared_mutex`,在不牺牲速度的前提下实现线程安全。让我们深入了解这个项目,并看看它如何改变游戏规则。 ## 项目介绍 `object_threadsafe`库包含三个核心组件

gitblog_00046的博客 486

Ubuntu上通过FinalShell或Asbru访问CentOS虚拟机

使用FinalShell或Asbru远程连接虚拟机

howard2005的专栏 2279

搭建你的第一个MCP服务器(Python版)

在上两篇博客中,我们已经对MCP(Model Context Protocol)有了初步的了解。MCP是一种强大的协议,能够简化LLM(大型语言模型)与外部工具的交互。今天,我们将通过一个具体的例子,展示如何使用Python搭建一个简单的MCP服务器。通过这个过程,你将能够更好地理解MCP的工作原理,并为后续的应用开发打下基础。在MCP中,工具(Tool)是服务器提供给LLM的接口。我们将定义一个简单的工具,用于接收输入文本并返回处理后的结果。首先,我们需要定义一个工具类。这个工具类将继承自,并实现run。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 8096

Smart pointers to boost your code(智能指针)

Smart pointers to boost your code(智能指针) (2012-03-24 14:07:58) 转载▼ 标签: it 分类: C/Cplusplus 1.智能指针:各种智能指针能够在任务结束的时候删除对象。 2.boost库提供了下面几种智能指针  shared_ptr  本指针中有一个引用指

zdy0_2004的专栏 525

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Boost.Interprocess使用手册翻译之十一:所有权的智能指针(Ownership smart pointers)

十一.所有权的智能指针 浸入式指针(Intrusive pointer) 作用域指针(Scoped pointer) 共享指针和弱指针(Shared pointer and weak pointer) 唯一指针(Unique pointer) 当处理资源时,C++使用者知道所有权智能指针的重要性。Boost提供了广泛的这些类型的指针:intrusive_p

great3779的专栏 3567

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

C++ boost库学习之——Smart Pointers

智能指针是用来存储动态分配给对象的指针的对象,与C++内置的指针十分相似,但是智能指针能够在合适的时间自动删除对象,从而释放空间。智能指针在遇到异常时尤其有用,因为它能够确保动态分配对象的正确析构。同时,智能指针还可以对多个拥有者共享的动态分配对象进行跟踪。        智能指针可以抽象地认为是拥有指向对象的对象,因此当不再需要动态分配的对象时,智能指针会负责释放对象。        智能指

Kikim的地盘 2128

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Smart Pointers in Boost

Smart Pointers in Boost<br />By Bjorn Karlsson, April 01, 2002<br /> 0 CommentsWelcome to Boost, the p

青青的专栏--C/C++ OOA/D Design Pattern 1203

Smart Pointers to boost your code

http://www.codeproject.com/Articles/8394/Smart-Pointers-to-boost-your-code Contents Smart Pointers can greatly simplify C++ development. Chiefly, they provide automatic memory management close t

梦想狂奔的专栏 689

boost C++库学习(1)-- smart pointers

1.  作用域指针boost::scoped_ptr        一个作用域指针boost::scoped_ptr.独占一个动态分配的对象。一个作用域指针不能传递它所包含的对象的所有权到另一个作用域指针。 #include int main() { boost::scoped_ptr i(new int); *i = 1; *i.get() = 2; i.reset(

WangQiang319670的博客 591

ubuntu 安装 Boost

Boost C++ 库是开源 C++ 库的集合,为 C++ 开发中常用的任务和功能提供支持。Boost 库在 C++ 开发人员中备受推崇,并广泛用于许多应用程序和软件项目中。Boost 库被设计为可移植、文档齐全且易于使用。它们在 Boost 软件许可证下分发,允许它们用于开源和商业项目。Boost 库涵盖了广泛的主题,包括实用程序、算法、数据结构和许多其他主题。

凡森 4605

Smart Pointers in C++

zhuanz C++ 智能指针详解   一、简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见。 用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法。包括:std::auto_ptr、boost::

Bluesilence的专栏 676

Boost学习笔记2:内存管理

(通常在对象所在命名空间或作为友元),Boost 会在构造/拷贝/析构。

taxue4485的专栏 890

[转]读《Boost程序库完全开发指南》

第1章 Boost程序库总论 使用Boost,将大大增强C++的功能和表现力    第2章 时间与日期 timer提供毫秒级的计时精度,内部是通过std::clock取时间的progress_timer自动打印某生命周期的执行时间原则上程序库的代码是不应该被用户修改的progress_display可以在控制台上显示程序的执行进度date_time库能很好的表示日期时间概念

云淡风清 1435

What you absolutely must know to use boost smart pointers correctly

From:http://www.codeproject.com/Articles/8394/Smart-Pointers-to-boost-your-code# A few things can go wrong with smart pointers (most prominent is an invalid reference count, which deletes the objec

boyhailong的专栏 823
上一篇: 注册表API简易教程
下一篇: Boost 的事件管理架構:Signal / Slot
cool_time
博客等级 码龄19年 2粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值