有些时候我们希望一个类成员除了自己的值以外,还能有一个“未被初始化”的状态,例如在一个 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++ 智能指针详解 std::auto_ptr
本篇文章收集了近一年来所有关于智能指针的面试相关内容。以智能指针的面试题线索,穿插讲解完最常用的四种智能指针的各个方面。本文讲解4个智能指针的基本概念和特性,以及其他设计到的知识点。讲解的过程中,如果...
代码说明见: RPCZ中的智能指针单例 http://blog.csdn.net/jq0123/article/details/44023961
C++ 7种智能指针测试代码
C++11提供了三种智能指针:std::shared_ptr, std::unique_ptr, std::weak_ptr,使⽤时需添加头⽂件。 shared_ptr使⽤引⽤计数,每⼀个shared_ptr的拷贝都指向相同的内存。每使⽤他⼀次,内部的引⽤计数加1,每析构...
智能指针是用来实现指针指向的对象的共享的。其实现的基本思想: 每次创建类的新对象时,初始化指针并将引用计数置为1; 当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数; 对一个...
c语言指针和结构体:链表详解.ppt
智能指针是存储指向动态分配(堆)对象指针的类, 用于生存期控制, 能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的...
Android智能指针使用方法介绍 Android智能指针使用方法介绍
智能指针相信大家听说过吧,我理解的智能指针,既是一个C++模板类,重载了指针操作符(->)和(*)操作符,而使它的实例可以"用指针的形式去调用"。 它可以接管任意类型的指针,所以你只需要放心大胆的new出任意对象...
一个实现value_ptr C ++库-具有值语义的智能指针。 值类型简单直观。 不幸的是,有时实现细节需要我们使用指针。 标准库演示了如何方便地使用智能指针来编码所有权和生存期语义,但是没有一个智能指针实现价值...
为什么需要智能指针?因为c++的内存管理一直是个令人头疼的问题。 假如我们有如下person对象:每个person有自己的名字,并且可以告诉大家他叫什么名字 http://blog.csdn.net/qq_17242957/article/details/52404271
智能指针--真正的安全的指针 使用智能指针可以避免不必要的损失,他的->和*操作绝对安全的,他有类似java的垃圾回收机制
智能指针最全资料-5篇经典讲义,详细介绍了智能指针原理,boost库中的智能指针,以及VC中的智能指针。
讲解的很清楚,将智能指针的精华所在详细说明,增加理解智能指针。
代码量,2.5KB,指针共享操作,自动在最后一个智能指针销毁时delete,不再产生内存泄露。内含简单使用范例。不支持管理数组。设有Debug版本的断言,确保智能空指针不被使用。 /* 智能指针类 不能用于数组,指针指向...
该demo主要展现智能指针和引用计数的实现过程,总共两个类,一个智能指针类,一个引用计数类,另外附一份执行步骤资料
让你不再害怕指针,关于指针应用的技巧应用的讲解与指针的本质深入解析。
c++智能指针的创建 c及c++中的指针是很麻烦的 所以现在有很多技巧去减少问题的出现。 欢迎大家给出意见。