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的更多相关文章

  1. [5] 智能指针boost::shared_ptr

    [1]boost::shared_ptr简介 boost::shared_ptr属于boost库,定义在namespace boost中,包含头文件#include<boost/shared_p ...

  2. [6] 智能指针boost::weak_ptr

    [1]boost::weak_ptr简介 boost::weak_ptr属于boost库,定义在namespace boost中,包含头文件 #include<boost/weak_ptr.hp ...

  3. C++ 智能指针 boost::scoped_ptr分析

    1.scoped_ptr的实现原理及特性 特性:scoped_ptr和auto_ptr类似,但最大的区别就是不能转让管理权限,也就是说scoped_ptr禁止用户进行拷贝和赋值 实现原理:如何才能禁止 ...

  4. 【C++11新特性】 C++11智能指针之shared_ptr

    C++中的智能指针首先出现在“准”标准库boost中.随着使用的人越来越多,为了让开发人员更方便.更安全的使用动态内存,C++11也引入了智能指针来管理动态对象.在新标准中,主要提供了shared_p ...

  5. C++ | 再探智能指针(shared_ptr 与 weak_ptr)

    上篇博客我们模拟实现了 auto_ptr 智能指针,可我们说 auto_ptr 是一种有缺陷的智能指针,并且在C++11中就已经被摈弃掉了.那么本章我们就来探索 boost库和C++11中的智能指针以 ...

  6. 智能指针之shared_ptr基本概述

    1.shared_ptr允许有多个指针指向同一个对象,unique_ptr独占所指向的对象. 2.类似于vector,智能指针也是模板.创建智能指针: shared_ptr<string> ...

  7. C++智能指针之shared_ptr与右值引用(详细)

    1. 介绍 在 C++ 中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露.解决这个问题最有效的方法是使用智能指针(smart pointer).智能指针是存储指向动态分配(堆)对象指针 ...

  8. 智能指针tr1::shared_ptr、boost::shared_ptr使用

    对于tr1::shared_ptr在安装vs同一时候会自带安装,可是版本号较低的不存在.而boost作为tr1的实现品,包括 "Algorithms Broken Compiler Work ...

  9. 【STL学习】智能指针之shared_ptr

    前面已经学习过auto_ptr,这里补充另外一种智能指针,比auto_ptr要更强力更通用的shared_ptr. shared_ptr 简介及使用选择  几乎所有的程序都需要某种形式的引用计数智能指 ...

随机推荐

  1. WinFom基本属性

    常用窗体属性: AutoSroll:如果窗体内容超出了窗体范围,自动出现滚动条.默认是false. AutoSize:调节窗口大小时,保证使窗体内的内容必须全部显示出来. Location:控件左上角 ...

  2. dubbo子模块

    dubbo源码版本:2.5.4 经统计,dubbo一共有36个子模块,子模块如下: ---------------------------------------------------------- ...

  3. 改变CSS样式

    改变CSS样式 1.改变HTML元素样式的语法 //改变HTML样式的语法 document.getElementById(id).style.property = new style 例子: < ...

  4. SqlSever基础 rtrim与ltrim嵌套使用 除去字符串左右两边的空格

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  5. Cheatsheet: 2013 08.01 ~ 08.13

    Mobile Objective C Blocks: Summary, Syntax & Best Practices Android SDK: Create an Arithmetic Ga ...

  6. MySQL(六) —— 运算符和函数

    1. 字符函数   函数名称 描述 CONCAT()         字符连接                             CONCAT_WS()          使用指定的分隔符进行字 ...

  7. CHECKBOX_CHECKED built-in in Oracle D2k Forms

    CHECKBOX_CHECKED built-in in Oracle D2k Forms DescriptionA call to the CHECKBOX_CHECKED function ret ...

  8. hdu 1874(Dijkstra + Floyd)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Me ...

  9. FJNU 1152 Fat Brother And Integer(胖哥与整数)

    FJNU 1152 Fat Brother And Integer(胖哥与整数) Time Limit: 1000MS   Memory Limit: 257792K [Description] [题 ...

  10. 强制性签出被人没有签入的文件(在.net开发vs中)

    灵感,是天才的女神.她并不步履蹒跚地走过,而是在空中像乌鸦那么警觉地飞过的,她没有什么剽带给诗人抓握,她的头是一团烈火,她溜得快,像那些白里带红的鹤,教猎人见了无可奈何.——巴尔扎克(上海网站建设) ...