前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >boost 智能指针 shared_ptr

boost 智能指针 shared_ptr

作者头像
我与梦想有个约会
发布2023-10-20 17:36:38
1620
发布2023-10-20 17:36:38
举报
文章被收录于专栏:jiajia_dengjiajia_deng

boost 库中不单单这一种智能指针类型。但只有 shared_ptr 是最接近普通指针的一种智能指针,他具有一些非常良好的特性,比如计数器等等,使用 shared_ptr 可以让我们不用花费精力在内存回收上。其他的一些指针与 shared_ptr 的区别如下表:

2015-06-14_232943
2015-06-14_232943

本文主要介绍 shared_ptr 的一些特性,以后如果你使用到 boost 库,那么用到这个智能指针也会是最多的。 1、boost::shared_ptr****实现了计数引用: 它包装了new操作符在堆上分配的动态对象,但它实现了引用计数,可以自由的拷贝和赋值,在任意地方共享它。当引用计数为0时,它会自动删除被包装的动态分配的对象。 2、boost::shared_ptr不需要手动的调用类似release****方法: 它不像侵入式实现的智能指针一样需要手动的调用类似release方法,全部用由shared_ptr内部的计数器自动增减,这一点是非常有用的。(COM的IUnknow接口以及boost::intrusive_ptr都是基于侵入式设计的智能指针,需要手动调用类似release方法) 3、boost::shared_ptr支持所有权转移: 并且可以安全的存储在stl标准容器中,是在stl容器存储指针的标准解法。例如std::vector<int*> IntVec,使用shared_ptr方式为std::vector<boost::shared_ptr > IntptrVec. 4、boost::shared_ptr的代码操作和注意事项

代码语言:javascript
复制
#include 
#include <boost/shared_ptr.hpp>
using namespace std;
class MyClass
{
public:
void func()
{
cout << “MyClass func” << endl;
}
};
class Mem_malloc
{
public:
Mem_malloc()
{
m_int = (int*)malloc(sizeof(int) * 1024 * 1024 * 100); // 400M
}
~Mem_malloc()
{
free(m_int);
}
private:
int* m_int;
};
int main(int argc, char* argv[])
{
// 两种构造
boost::shared_ptr ptr;
boost::shared_ptr ptr_arr(new int(100));
// 与普通指针相差无几
int a = 111;
int* pA = &a;
cout << “*pA = “ << *pA << endl;
cout << “*ptr_arr = “ << *ptr_arr << endl;
// 操作对象
boost::shared_ptr ptr_obj;
boost::shared_ptr ptr_MyClass(new MyClass());
ptr_obj = ptr_MyClass;
ptr_obj->func();
// 智能指针避免普通指针和智能指针混用
// 防止智能指针计数器为0将内存释放后,普通指针就变了野指针。
int* p_int001 = new int(100);
int* p_int002 = p_int001;
//boost::shared_ptr ptr_int003 = p_int002;// 错误的,不能混用
boost::shared_ptr ptr_int004(new int(100));
//int* p_int005 = ptr_int004;// 错误的,不能混用
// 引用计数
boost::shared_ptr ptr_obj001(new MyClass());
cout << ptr_obj001.use_count() << endl;
boost::shared_ptr ptr_obj002 = ptr_obj001;
// 指向同一对象时,两个智能指针的引用计数都会增加
cout << ptr_obj002.use_count() << endl;
cout << ptr_obj001.use_count() << endl;
{
// 新作用域指向同一对象,同样会自增引用计数
boost::shared_ptr ptr_obj003 = ptr_obj001;
cout << “new function” << endl;
cout << “ptr_obj003.use_count() = “ << ptr_obj003.use_count() << endl;
cout << “ptr_obj002.use_count() = “ << ptr_obj002.use_count() << endl;
cout << “ptr_obj001.use_count() = “ << ptr_obj001.use_count() << endl;
}
// 离开作用域后,原作用域内的引用计数会被减去
cout << “exit function” << endl;
cout << “ptr_obj002.use_count() = “ << ptr_obj002.use_count() << endl;
cout << “ptr_obj001.use_count() = “ << ptr_obj001.use_count() << endl;
// 测试智能指针是否会释放内存
{
cout << “准备分配内存” << endl;
// 这个过程打开任务管理器,按下任意键后看内存的变化
system(“pause”);
boost::shared_ptr<Mem_malloc> ptr_obj004(new Mem_malloc());
cout << “准备释放内存” << endl;
// 离开作用域后再看内存的变化
system(“pause”);
// 离开作用域后会自动释放ptr_obj004指向的内存,在任务管理器中,可以明显的看到我们进程内存的变化
}
return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档