boost库之shared_ptr

Boost库简单运用——shared_ptr Boost库简单运用——shared_ptr概述​ 在C++项目中,内存管理的问题一直是个大问题,也是个很常见的问题。项目交由经验不足的程序员来编写维护,常出现内存泄漏、访问非法内存之类的问题,资历较老的程序员也不可避免会出错。所幸STL与Boost都为我们提供了管理动态内存的工具,我们只要如寻常指针一般使用即可,无需担心以往会出现的内存管理上的问题了。这里就先介绍一个shared_ptr,就功 阅读详情

shared_ptr

1简介编辑

shared_ptr是一种 智能指针(smart pointer)。

2作用编辑

shared_ptr的作用有如同 指针,但会记录有多少个 shared_ptrs共同指向一个对象。这便是所谓的 引用计数(reference counting)。一旦最后一个这样的 指针被销毁,也就是一旦某个对象的 引用计数变为0,这个对象会被自动删除。这在非环形数据结构中防止资源泄露很有帮助。
auto_ptr由于它的破坏性复制语义,无法满足标准容器对元素的要求,因而不能放在标准容器中;如果我们希望当容器析构时能自动把它容纳的 指针元素所指的对象删除时,通常采用一些间接的方式来实现,显得比较繁琐。 boost库中提供了一种新型的 智能指针shared_ptr,它解决了在多个指针间共享对象所有权的问题,同时也满足容器对元素的要求,因而可以安全地放入容器中。

3历史编辑

shared_ptr最初实现于 Boost库中,后来被C++标准委员会收录于TR1技术报告中,成为 C++0x的一部分。 

4概要编辑

namespace boost {
class bad_ weak_ptr: public std::exception;
template<class T> class  weak_ptr;
template<class T> class  shared_ptr {
public:
typedef T element_type;
shared_ptr(); // never throws
template<class Y> explicit  shared_ptr(Y * p);
template<class Y, class D>  shared_ptr(Y * p, D d);
template<class Y, class D, class A>  shared_ptr(Y * p, D d, A a);
~shared_ptr(); // never throws
shared_ptr(shared_ptr const & r); // never throws
template<class Y>  shared_ptr(shared_ptr<Y> const & r); // never throws
template<class Y>  shared_ptr(shared_ptr<Y> const & r, T * p); // never throws
template<class Y> explicit  shared_ptr( weak_ptr<Y> const & r);
template<class Y> explicit  shared_ptr(std::auto_ptr<Y> & r);
shared_ptr & operator=(shared_ptr const & r); // never throws
template<class Y> shared_ptr & operator=(shared_ptr<Y> const & r); // never throws
template<class Y> shared_ptr & operator=(std::auto_ptr<Y> & r);
void  reset(); // never throws
template<class Y> void  reset(Y * p);
template<class Y, class D> void  reset(Y * p, D d);
template<class Y, class D, class A> void  reset(Y * p, D d, A a);
template<class Y> void  reset(shared_ptr<Y> const & r, T * p); // never throws
T & operator*() const; // never throws
T * operator->() const; // never throws
T *  get() const; // never throws
bool unique() const; // never throws
long use_count() const; // never throws
operator  unspecified-bool-type() const; // never throws
void  swap(shared_ptr & b); // never throws
};
template<class T, class U>
bool operator==(shared_ptr<T> const & a, shared_ptr<U> const & b); // never throws
template<class T, class U>
bool operator!=(shared_ptr<T> const & a, shared_ptr<U> const & b); // never throws
template<class T, class U>
bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b); // never throws
template<class T> void  swap(shared_ptr<T> & a, shared_ptr<T> & b); // never throws
template<class T> T * get_pointer(shared_ptr<T> const & p); // never throws
template<class T, class U>
shared_ptr<T> static_pointer_cast(shared_ptr<U> const & r); // never throws
template<class T, class U>
shared_ptr<T> const_pointer_cast(shared_ptr<U> const & r); // never throws
template<class T, class U>
shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const & r); // never throws
template<class E, class T, class Y>
std::basic_ostream<E, T> & operator<<(std::basic_ostream<E, T> & os, shared_ptr<Y> const & p);
template<class D, class T>
D * get_deleter(shared_ptr<T> const & p);
} [1]

5用法编辑

删除共享对象

使用 shared_ptr解决的主要问题是知道删除一个被多个客户共享的资源的正确时机。下面是一个简单易懂的例子,有两个类 A和 B, 它们共享一个int实例。使用 boost:: shared_ptr, 你需要必须包含 "boost/ shared_ptr.hpp".
#include "boost/ shared_ptr.hpp"
#include <cassert>
class A {
boost::shared_ptr<int> no_;
public:
A(boost::shared_ptr<int> no) : no_(no) {}
void value(int i) {
*no_=i;
}
};
class B {
boost::shared_ptr<int> no_;
public:
B(boost::shared_ptr<int> no) : no_(no) {}
int value() const {
return *no_;
}
};
int main() {
boost::shared_ptr<int> temp(new int(14));
A a(temp);
B b(temp);
a.value(28);
assert(b.value()==28);
} 类 A和 B都保存了一个 shared_ptr<int>. 在创建 A和 B的实例时,shared_ptr temp被传送到它们的 构造函数。这意味着共有三个  shared_ptr:a, b, 和 temp,它们都引向同一个int实例。如果我们用 指针来实现对一个的共享,A和 B必须能够在某个时间指出这个int要被删除。在这个例子中,直到main的结束, 引用计数为3,当所有  shared_ptr离开了作用域,计数将达到0,而最后一个 智能指针将负责删除共享的 int.

标准容器

把对象直接存入容器中有时会有些麻烦。以值的方式保存对象意味着使用者将获得容器中的元素的拷贝,对于那些复制是一种昂贵的操作的类型来说可能会有性能的问题。此外,有些容器,特别是 std::vector, 当你加入元素时可能会复制所有元素,这更加重了性能的问题。最后,传值的语义意味着没有多态的行为。如果你需要在容器中存放多态的对象而且你不想切割它们,你必须用 指针。如果你用裸 指针,维护元素的完整性会非常复杂。从容器中删除元素时,你必须知道容器的使用者是否还在引用那些要删除的元素,不用担心多个使用者使用同一个元素。这些问题都可以用 shared_ptr来解决。
下面是如何把共享 指针存入标准库容器的例子。
#include "boost/shared_ptr.hpp"
#include <vector>
#include <iostream>
class A {
public:
virtual void sing()=0;
protected:
virtual ~A() {};
};
class B : public A {
public:
virtual void sing() {
std::cout << "Do re mi fa so la";
}
};
boost::shared_ptr<A> createA() {
boost::shared_ptr<A> p(new B());
return p;
}
int main() {
typedef std::vector<boost::shared_ptr<A> > container_type;
typedef container_type::iterator iterator;
container_type container;
for (int i=0;i<10;++i) {
container.push_back(createA());
}
std::cout << "The choir is gathered: \n";
iterator end=container.end();
for (iterator it=container.begin();it!=end;++it) {
(*it)->sing();
}
} 这里有两个类, A和 B, 各有一个虚拟成员函数 sing. B从 A公有继承而来,并且如你所见,工厂函数 createA返回一个动态分配的B的实例,包装在shared_ptr<A>里。在 main里, 一个包含shared_ptr<A>的 std::vector被放入10个元素,最后对每个元素调用sing。如果我们用裸 指针作为元素,那些对象需要被手工删除。而在这个例子里,删除是自动的,因为在vector的生存期中,每个 shared_ptr的 引用计数都保持为1;当 vector被销毁,所有引用计数器都将变为零,所有对象都被删除。有趣的是,即使 A的 析构函数没有声明为 virtual,  shared_ptr也会正确调用 B的析构函数!
上面的例子示范了一个强有力的技术,它涉及A里面的protected 析构函数。因为函数 createA返回的是 shared_ptr<A>, 因此不可能对shared_ptr:: get返回的 指针调用 delete。这意味着如果为了向某个需要裸 指针的函数传送裸指针而从 shared_ptr中取出裸指针的话,它不会由于意外地被删除而导致灾难。那么,又是如何允许  shared_ptr删除它的对象的呢? 这是因为 指针指向的真正类型是 B; 而B的 析构函数不是protected的。这是非常有用的方法,用于给 shared_ptr中的对象增加额外的安全性。
转自:
1 百度百科
2 http://blog.youkuaiyun.com/sndaxdrs/article/details/6175701
Boost库的智能指针shared_ptr剖析 之前的博客对Boost库的智能指针诞生的原因它们的作用,VS 和 VC下auto_ptr的不足,还解析了vc下的auto_ptr,以及Boost库的scoped_ptr和scoped_array这两个兄弟智能指针,可以查看之前的博客,今天我们直接入手shared_ptr。 shared_ptr简介 shared.ptr 是一个最像指针的“智能指针”,是boost.smart.ptr 库中最... 阅读详情

相关推荐

【BOOST C++指针专题03】共享指针boost::shared_ptr

boost::shared_ptr是另一个智能指针,与 boost::scoped_ptr有很大不同,本文阐述这种区别。

gongdiwudu的专栏 6410

[C++] Boost智能指针——boost::shared_ptr(使用及原理分析)

简介 boost::shared_ptr是可以共享所有权的指针。如果有多个shared_ptr共同管理同一个对象时,只有这些shared_ptr全部与该对象脱离关系之后,被管理的对象才会被释放。通过下面这个例子先了解下shared_ptr的基本用法: 1 #include <iostream> 2 #include <string> 3 #inc...

weixin_34162629的博客 1276

boost---共享指针boost::shared_ptr

1、特点: (1)、boost::shared_ptr不独占一个对象,它可以和其他boost::shared_ptr类型的智能指针共享所有权; (2)、使用引用计数来管理,当引用对象的最后一个智能指针销毁后,对象才会被释放; (3)、boost::shared_ptr的构造函数的第二个参数是一个普通函数或者函数对象,该参数用来销毁所含的对象,默认是delete。 (4)、随着bo...

小米的修行之路 1276

boost shared_ptr基本用法介绍

一、介绍 share_ptr包装了new操作符在堆上分配的动态对象,但他实现的是计数型的智能指针,share_ptr早期的名字就是counter_ptr,可以自由拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0时)它才删除被包装的动态分配的对象。share_ptr也可以安全地放到标准容器中,是在STL容器中存储指针最标准的解法。 template<class T> class shared_ptr { public: typedef T element_type; //

weixin_41176628的博客 4264

C++ boost库智能指针(二):shared_ptr和shared_array

shared_ptr是boost最重要的智能指针,最像智能指针的"智能指针",由于它的优越表现,被加入了C++11标准。 shared_ptr与scoped_ptr —样包装了 new操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针,可以被自由地拷贝和赋值,在任意的地方共享它,和scoped_ptr、auto_ptr一样重载了“*”和“->”,用get()可以获取被管理的指针,也没有算术操作符,同样也不能管理数组内存,当没有代码使用(引用计数为0)它时...

琅嬛福地 1324

Zynq工程IP核封装:XCI引用与约束继承实战指南

IP核封装是FPGA系统设计中实现模块复用、团队协作与技术资产沉淀的关键环节。其本质是将功能逻辑、时序约束、接口协议和硬件配置统一抽象为可配置、可验证、可演进的标准化组件。核心原理在于通过XCI文件保留IP核的参数化定义能力,依托Vivado IP Packager实现约束继承、端口自动映射与时钟域解耦,从而保障跨项目集成的时序可信性与约束完备性。该技术广泛应用于Zynq SoC视频处理、高速接口(如HDMI/TMDS)、多时钟域控制系统等场景,尤其在需要长期维护与版本迭代的工业级嵌入式开发中具有不可替代的

weixin_42593701的博客 122

(六)boost库之内存管理shared_ptr

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33724059的博客 311

Win11家庭版如何让Win+R运行CMD默认管理员权限?3种方法实测有效

本文针对Win11家庭版用户,实测了三种让Win+R运行CMD默认获取管理员权限的有效方法。通过分析UAC机制与家庭版功能限制,详细介绍了注册表编辑、快捷方式创建与任务计划程序三种方案的原理、步骤与风险对比,帮助用户根据安全与效率需求选择最佳方案,实现一键高效管理。

sat99的博客 1266

Boost库之shared_ptr应用

概解:      shared_ptr非常有价值、非常重要、非常有用!      shared_ptr是一个最像指针的"智能指针",是boost::smart_ptr库中最有价值、最重要的组成部分,也是最有用的,Boost库中许多组件--甚至还包括其他一些领域的智能指针都使用了shared_ptr。      shared_ptr与scoped_ptr一样包装了new操作符在堆上分配的动态对

hlj_include的博客 861

P1003 [NOIP2011 提高组] 铺地毯 python题解

解题思路: 1、根据题意,所有地毯都是挨着铺的,所以最上面的一条符合题意的一定是从后往前数的第一条符合题意的。 2、符合题意要求x和y同时满足大于等于地毯左边坐标并且小于等于地毯右边坐标。 代码如下: n = int(input()) a = [] for i in range(n): a.append(list(map(int,input().split()))) x,y = list(map(int,input().split())) l = len(a) while l > 0: ..

繁华三千东流水不舍昼夜的博客 1620

【漏洞复现】7-Zip目录穿越漏洞(CVE-2025-11001)

摘要:CVE-2025-11001是7-Zip(v21.02-v24.09)Windows版处理ZIP包符号链接时的高危漏洞,攻击者可构造恶意ZIP文件实现目录穿越和任意文件写入。漏洞源于路径检查缺陷,当用户解压含特殊符号链接的压缩包时,可能将文件写入系统目录。复现利用GitHub公开的Python脚本(https://github.com/pacbypass/CVE-2025-11001)可生成攻击包,需注意该漏洞仅影响Windows且需要用户交互。

LongL_GuYu的博客 1607

C++ Boost库:共享所有权的智能指针 shared_ptr

文章目录1. 简介2. shared_ptr示例代码3. shared_ptr使用陷阱 1. 简介 shared_ptr是可以共享所有权的指针。如果有多个shared_ptr共同管理同一个对象时,只有这些 shared_ptr全部与该对象分离之后,被管理的对象才会被释放,使用需要包含头文件: #include <boost/shared_ptr.hpp> 注:c++11标准中std::shared_ptr与 boost::shared_ptr功能相似。 shared_ptr使用引用计数,每一

超级大洋葱的博客 2737

【树莓派安装Homeassistant及基本配置】

时隔一年,我又重新开始玩Homeassistant,发现其中奥妙无穷,惊喜不断。在我浅薄的认知中要学好嵌入式,必须玩过Homeassistant,并且玩出自己的名堂!因为这是最贴切实际的生活应用没有之一,每月更新使得唯有活水来;拥抱大千使得永葆青春的活力;鬼斧神工的操作精彩纷呈,可以堪称软件与硬件的完美落地!

vor234的博客 1万+

3.2 Boost库shared_ptr类处理开辟的内存空间

shared_ptr是Boost库中的智能指针,采用引用计数机制管理动态分配的内存对象。它支持拷贝、赋值和共享,当引用计数归零时自动释放资源。shared_ptr提供了丰富的构造函数、解引用操作符、重置函数及引用计数查询功能,可安全用于标准容器。通过定制删除器,它能管理非内存资源如文件句柄和socket。文章还介绍了shared_ptr在工厂模式、桥接模式中的应用,以及与标准库的兼容性,包括指针转型函数、别名构造函数等高级特性,使其成为C++中强大的资源管理工具。

weixin_44863825的博客 789

使用MATLAB实现PAC2002轮胎模型的TIR文件解析和模型计算详解

PAC2002轮胎模型是由荷兰TNO公司开发的一种半经验的轮胎模型,用于描述轮胎在不同工况下的力学特性。该模型基于一系列物理和经验参数,通过复杂的数学表达式来模拟轮胎的力学行为,包括纵向力、侧向力、回正力矩等。

qq_38334677的博客 2427

rk3576 点亮 LCD(mipi)

瑞芯微 RK3576 是一款面向中高端 AIoT 市场的 SoC,其 MIPI DSI (Display Serial Interface) 接口在性能和灵活性上相比前代(如 RK3399/RK3568)有显著提升,特别是在物理层协议的支持上更加现代化。相比RK3399 RK3568的mipi 接口少了 8lane,但是RK3576 MIPI DSI 增加更低功耗的 C-PHY。

weixin_35723192的博客 362

Boost库智能指针boost::shared_ptr详解和常用场景使用错误示例以及解决方法

是 Boost 库中实现的一个智能指针模板类,用于管理动态分配的对象生命周期,采用引用计数机制。多个shared_ptr实例可以共享同一个对象的所有权,引用计数自动管理,最后一个shared_ptr销毁时,自动释放对象,避免内存泄漏。其中T是管理的对象类型。函数名说明返回当前共享对象的引用计数reset()释放当前管理对象,指针置空get()返回裸指针,不影响引用计数解引用指针,返回对象引用访问对象成员unique()判断是否唯一拥有者是强大的共享所有权智能指针。支持拷贝,自动管理引用计数。

qq_36812406的博客 746

C# 开发实战:深度解析 13.56MHz 射频卡读写应用

本文详细介绍了如何在 C# 环境下开发 13.56MHz 射频卡的读写应用。通过 ACR122U 作为硬件设备,结合 C# 提供的 COM 组件或 SDK,我们能够实现对射频卡的读取与写入功能。在实际开发中,开发者还需要根据具体应用场景选择合适的卡片类型与设备,并注意性能优化和异常处理。随着技术的发展,RFID 技术的应用场景会越来越广泛,开发者可以根据不同需求,灵活扩展读写功能,实现更加智能化和自动化的系统。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1599

boost库之shared_ptr库,智能指针

使用说明:         1. shared_ptr默认值是NULL         2. 赋值         3.reset()         4. 函数返回share_ptr为NULL 代码: #include #include #include using namespace std; using namespace boost; //4. return

kanguolaikanguolaik的专栏 1097

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【Boost】boost库中智能指针——shared_ptr

boost::scoped_ptr虽然简单易用,但它不能共享所有权的特性却大大限制了其使用范围,而boost::shared_ptr可以解决这一局限。顾名思义,boost::shared_ptr是可以共享所有权的智能指针,首先让我们通过一个例子看看它的基本用法: #include #include #include class implementation { public:

liujiayu2的专栏 584

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

c++ boost库之scoped_ptr,shared_ptr,weak_ptr智能指针

boost库 scoped_ptr,shared_ptr,weak_ptr作用及使用示例

qq_39048131的博客 307

boost 库的 shared_ptr

为了管理内存等资源,C++程序员通常采用RAII机制(资源获取即初始化),在使用资源的类的构造函数中申请资源,然后使用,最后在析构函数中释放资源。如果对象是用new 操作符在堆上创建的,那么它的析构函数就不会自动调用,或者因为某些意外如抛出异常而导致程序未能执行delete 语句,那么内存等资源就永久的丢失了。。   以上原因就使得" 智能指针"的出现,“智能指针”实现了“设计模式”中的代理模

GIRL03的专栏 888

Boost库学习—智能指针Shared_ptr学习01

声明:本人属于技术小白,文章中的用词可能不够准确,本人书写文章仅仅是个人记录,不足之处希望大家批评指正,也请阅读本文者谅解!

A_C_O_C的专栏 995

boost库的shared_ptr剖析

shared_ptr其实就是一个模板类。 shared_ptr是Boost里面最有价值的的智能指针。它封装了一个原生态指针和一个引用计数器,这个引用计数器是一个类shared_count。shared_ptr支持比较运算,重载了operator shared_ptr的应用:当shared_ptr指针指向了一个对象,之后又有另一个shared_ptr指针指向了那个对象,那么这个指针的计数变成了二

hello_bravo_的博客 604
上一篇: pthread_join
下一篇: mysql优化---第7篇:参数 innodb_buffer_pool_instances设置
crazyhacking
博客等级 码龄15年 299粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值