`
feipigwang
  • 浏览: 745530 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

智能指针的另外用途:optional value 手法

 
阅读更多
有些时候我们希望一个类成员除了自己的值以外,还能有一个“未被初始化”的状态,例如在一个 Server 里面,我们需要管理 user 数量:

class Server
{
//...
int userCount_;
//...
};

userCount_ 当然是初始化为0,但是有时候并不如此简单,很多资源可能是在第一个 user 使用的时候被分配的,而回收资源的时候,如果仅仅看到 userCount_ 为0,我们压根就不知道到底是曾经有过 user ,只是现在没有(这样我们就需要回收某些资源),还是从来就没有 user 连接过(这样我们就不需要回收资源)。换句话说,userCount_ == 0 表达了两种可能,而我们希望能在这两种可能之间作区分。

Boost.optional 就是做这个的,但是有的时候又不值得为了这个目的而引入一个新的库。当然你可以这样:

class Server
{
//...
int userCount_;
bool userCountInited_;
//...
};

userCountInited_ 初始化为 false ,而在第一次有用户使用的时候,userCountInited_ 变成 true,并且一直保持 true 。这样我们就得以区分“没有用户”和“从来没有过用户”。这无疑是有效的,缺点在于:

1. 你为了一个很小的目的增加了一个用处不大的成员
2. 你从此要小心地维护 userCountInited_ 与 userCount_ 的同步

记得 C++ 指针最讨厌的是什么吗?那就是它可能处于“未初始化状态”,从而不指向任何一个合法的变量。但是在这里,“未初始化状态”正是我们想要利用的!当然,在这个年头使用 raw pointer 有点太老土和危险了,我们可以用智能指针取代之。

class Server
{
//...
auto_ptr<int> userCount_;
// 或者:
// share_ptr<int> userCount_;
//...
};

现在,“未初始化”可以表示成这样:

if ( !userCount_.get() ) // auto_ptr
//...
if ( !userCount_ ) // shared_ptr
//...

而 userCount_ 增加的操作就变成:

if ( !userCount_.get() )
userCount_.reset ( new int(0) );
++*userCount_;

你甚至还可以把它重新打回“未初始化”状态:

userCount_.release();

如此一来,我们就用一个变量表达了“未初始化”,“初始化,但为0”和“有非0值”三种概念。

分享到:
评论

相关推荐

    c++智能指针源码分析:文件memory之类-Ref-count-resource-alloc

    c++智能指针源码分析:文件memory之类-Ref-count-resource-alloc

    C++_智能指针详解

    C++ 智能指针详解 std::auto_ptr

    c++智能指针最全知识点即面试题目总结

    本篇文章收集了近一年来所有关于智能指针的面试相关内容。以智能指针的面试题线索,穿插讲解完最常用的四种智能指针的各个方面。本文讲解4个智能指针的基本概念和特性,以及其他设计到的知识点。讲解的过程中,如果...

    RPCZ中的智能指针单例代码

    代码说明见: RPCZ中的智能指针单例 http://blog.csdn.net/jq0123/article/details/44023961

    C++智能指针测试代码

    C++ 7种智能指针测试代码

    智能指针shared-ptr的用法.pdf

    C++11提供了三种智能指针:std::shared_ptr, std::unique_ptr, std::weak_ptr,使⽤时需添加头⽂件。 shared_ptr使⽤引⽤计数,每⼀个shared_ptr的拷贝都指向相同的内存。每使⽤他⼀次,内部的引⽤计数加1,每析构...

    c++智能指针的实现

    智能指针是用来实现指针指向的对象的共享的。其实现的基本思想: 每次创建类的新对象时,初始化指针并将引用计数置为1; 当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数; 对一个...

    c语言指针和结构体:链表详解.ppt

    c语言指针和结构体:链表详解.ppt

    C++智能指针实现

    智能指针是存储指向动态分配(堆)对象指针的类, 用于生存期控制, 能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的...

    Android智能指针使用方法介绍

    Android智能指针使用方法介绍 Android智能指针使用方法介绍

    smartptr——基于自动引用计数的智能指针

    智能指针相信大家听说过吧,我理解的智能指针,既是一个C++模板类,重载了指针操作符(-&gt;)和(*)操作符,而使它的实例可以"用指针的形式去调用"。 它可以接管任意类型的指针,所以你只需要放心大胆的new出任意对象...

    有价值:具有价值语义的C ++智能指针:gem_stone:

    一个实现value_ptr C ++库-具有值语义的智能指针。 值类型简单直观。 不幸的是,有时实现细节需要我们使用指针。 标准库演示了如何方便地使用智能指针来编码所有权和生存期语义,但是没有一个智能指针实现价值...

    智能指针的理解 和 简单实现

    为什么需要智能指针?因为c++的内存管理一直是个令人头疼的问题。 假如我们有如下person对象:每个person有自己的名字,并且可以告诉大家他叫什么名字 http://blog.csdn.net/qq_17242957/article/details/52404271

    智能指针--真正的安全的指针

    智能指针--真正的安全的指针 使用智能指针可以避免不必要的损失,他的-&gt;和*操作绝对安全的,他有类似java的垃圾回收机制

    智能指针最全资料-5篇经典讲义

    智能指针最全资料-5篇经典讲义,详细介绍了智能指针原理,boost库中的智能指针,以及VC中的智能指针。

    c++智能指针介绍的PPT

    讲解的很清楚,将智能指针的精华所在详细说明,增加理解智能指针。

    C++智能指针实现(不用再担心你的内存泄露)

    代码量,2.5KB,指针共享操作,自动在最后一个智能指针销毁时delete,不再产生内存泄露。内含简单使用范例。不支持管理数组。设有Debug版本的断言,确保智能空指针不被使用。 /* 智能指针类 不能用于数组,指针指向...

    智能指针与引用计数详解

    该demo主要展现智能指针和引用计数的实现过程,总共两个类,一个智能指针类,一个引用计数类,另外附一份执行步骤资料

    C++指针应用教学:让你不再害怕指针

    让你不再害怕指针,关于指针应用的技巧应用的讲解与指针的本质深入解析。

    c++智能指针的创建

    c++智能指针的创建 c及c++中的指针是很麻烦的 所以现在有很多技巧去减少问题的出现。 欢迎大家给出意见。

Global site tag (gtag.js) - Google Analytics