关于智能指针boost::shared_ptr
boost库中的智能指针shared_ptr, 功能强大, 且开销小,故受到广大coder的欢迎。
但在实际的使用过程中,笔者也发现了一些不足。
1、定制的删除器
shared_ptr除了可以使用默认的delete删除器来删除资源, 也可以定制删除器来删除资源, 但是删除的时候没有办法返回值, 这应该可以算是一个缺陷。
如对于文件句柄的操作
bool CFileIO::Open(LPCTSTR fileName, LPCTSTR mode)
{
m_pFile.reset(_tfopen(fileName, mode), fclose);
return m_pFile.unique();
}
bool CFileIO::Close(void)
{
m_pFile.reset();
return true;
}
这时候Close没有办法返回实际的操作状态。
2、函数没有办法把shared_ptr中保存的原始指针直接返回, 因为share_ptr在函数返回后会自动销毁,因此对应的资源也会被释放。如
T *GetObject()
{
shared_ptr<T> ret;
...
return ret.get();
}
究其原因,是因为shared_ptr没有一个接口, 可以像std::auto_ptr的release来手动释放所有权, 因此这种情况下只能使用auto_ptr了。
3、对于shared_ptr为什么不引出接口operator T*() const, 我感到很奇怪。因为若是一个接口的形式如下
template<class T>
void func(T *p);
这个时候如果直接传shared_ptr变量会编译出错。
4、智能指针的陷阱
在一个对象的析构函数里再把它传入某个智能指针对象,这样会引起循环析构。
如:
class CObject
{
~CObject();
} CObject::~CObject()
{
test(this);
} void test(boost::shared_ptr<CObject> object)
{
}
关于智能指针boost::shared_ptr的更多相关文章
- [5] 智能指针boost::shared_ptr
[1]boost::shared_ptr简介 boost::shared_ptr属于boost库,定义在namespace boost中,包含头文件#include<boost/shared_p ...
- [6] 智能指针boost::weak_ptr
[1]boost::weak_ptr简介 boost::weak_ptr属于boost库,定义在namespace boost中,包含头文件 #include<boost/weak_ptr.hp ...
- C++ 智能指针 boost::scoped_ptr分析
1.scoped_ptr的实现原理及特性 特性:scoped_ptr和auto_ptr类似,但最大的区别就是不能转让管理权限,也就是说scoped_ptr禁止用户进行拷贝和赋值 实现原理:如何才能禁止 ...
- 【C++11新特性】 C++11智能指针之shared_ptr
C++中的智能指针首先出现在“准”标准库boost中.随着使用的人越来越多,为了让开发人员更方便.更安全的使用动态内存,C++11也引入了智能指针来管理动态对象.在新标准中,主要提供了shared_p ...
- C++ | 再探智能指针(shared_ptr 与 weak_ptr)
上篇博客我们模拟实现了 auto_ptr 智能指针,可我们说 auto_ptr 是一种有缺陷的智能指针,并且在C++11中就已经被摈弃掉了.那么本章我们就来探索 boost库和C++11中的智能指针以 ...
- 智能指针之shared_ptr基本概述
1.shared_ptr允许有多个指针指向同一个对象,unique_ptr独占所指向的对象. 2.类似于vector,智能指针也是模板.创建智能指针: shared_ptr<string> ...
- C++智能指针之shared_ptr与右值引用(详细)
1. 介绍 在 C++ 中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露.解决这个问题最有效的方法是使用智能指针(smart pointer).智能指针是存储指向动态分配(堆)对象指针 ...
- 智能指针tr1::shared_ptr、boost::shared_ptr使用
对于tr1::shared_ptr在安装vs同一时候会自带安装,可是版本号较低的不存在.而boost作为tr1的实现品,包括 "Algorithms Broken Compiler Work ...
- 【STL学习】智能指针之shared_ptr
前面已经学习过auto_ptr,这里补充另外一种智能指针,比auto_ptr要更强力更通用的shared_ptr. shared_ptr 简介及使用选择 几乎所有的程序都需要某种形式的引用计数智能指 ...
随机推荐
- SVG 是什么?
SVG 意为可缩放矢量图形(Scalable Vectors Graphics). SVG 图形在放大或者改变尺寸的情况下,其图形的质量不会有所损失. SVG 使用 XML 格式定义图形. ...
- (转)Linux下安装rar fou linux
在Linux下安装rar fou linux rar for linux 软件下载地址:http://www.rarsoft.com/download.htm 到目前为止最新的版本为4.10 beta ...
- MySQL基础(二)——DDL语句
MySQL基础(二)--DDL语句 1.什么是DDL语句,以及DDL语句的作用 DDL语句时操作数据库对象的语句,这些操作包括create.drop.alter(创建.删除.修改)数据库对象. 2.基 ...
- 如何提高android串口kernel log等级
在 /device/qcom/common/rootdir/etc/init.qcom.rc write /proc/sys/kernel/printk "6 6 1 7" 第一 ...
- C#实例
输出 Console.WriteLine("Hello, World!"); //输出Hello, World! 输出输入的内容 string strName; //声明一个str ...
- git commit时message的问题
1: 在执行git commit的时候,有两种办法为该commit添加message信息一种是git commit -m 'your message'另一种是git commit会打开commit-e ...
- Spring的核心机制——依赖注入(Dependency Inject)
Spring不仅提供对象,还提供对象的属性值,而不是由使用该对象的程序所提供的. Java应用是由一些相互协作的对象所组成的,在Spring中这种相互协作的关系就叫依赖关系. 如果A组件调用了B组件的 ...
- [SAP ABAP开发技术总结]采购、销售、生产简单业务流程
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- JavaScript 拼接JSON
<script language="javascript" type="text/javascript"> var json="" ...
- bzoj 1054: [HAOI2008]移动玩具 bfs
1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description 在 ...