关于智能指针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 简介及使用选择 几乎所有的程序都需要某种形式的引用计数智能指 ...
随机推荐
- 解决maven项目将model version改成3.0版本问题
找到项目目录,找到.setting文件 找到org.eclipse.wst.common.project.facet.core.xml文件 修改如下标签 <installed facet=&qu ...
- C#之winform基础 button1_Click(object sender, EventArgs e)中sender是啥及其用法
镇场诗: 大梦谁觉,水月中建博客.百千磨难,才知世事无常. 今持佛语,技术无量愿学.愿尽所学,铸一良心博客.---------------------------- ...
- 手机开机画面制作工具(LogoBuilder)
手机开机画面制作工具(LogoBuilder) 本人想在自己的设备中采用其他设备上开机的logo,首先需要此设备上的logo.bin,然后用LogoBuilder解压出来,具体步骤如下: 1. ...
- 【leetcode❤python】Move Zeroes
#-*- coding: UTF-8 -*- #filter()函数可以对序列做过滤处理,就是说可以使用一个自定的函数过滤一个序列,#把序列的每一项传到自定义的过滤函数里处理,并返回结果做过滤.最终一 ...
- JAVA WEB SpringMVC+Spring+hibernate 框架搭建【转】
http://my.oschina.net/Thinkeryjgfn/blog/158951
- netsh winsock reset 11003
netsh winsock reset 11003 http://files.cnblogs.com/xsmhero/winsock.zip
- ProgressDialog 的 使用
一 . ProgressDialog ProgressDialog是AlertDialog类的一个扩展,可以为一个未定义进度的任务显示一个旋转轮形状的进度动画,或者为一个指定进度的任务显示一个进度条. ...
- 查看博客模板的css代码
1.可以去模板列表里选择一个模板 http://www.cnblogs.com/Skins.aspx 目前使用的模板是http://www.cnblogs.com/SkinUser.aspx?Skin ...
- 业务对象和BAPI
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- LINQ之路 4:LINQ方法语法
书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询语法(Query Expression). LINQ方法语法是非常灵活和重要的,我们在这里将描述使用链接查询运算符的方 ...