青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

OnTheWay2012
埋葬昨天的我,迎來(lái)重生的我!
posts - 15,  comments - 89,  trackbacks - 0
        很久以前就對(duì)基于引用計(jì)數(shù)的指針指針很感興趣,今天突然又一次想到這個(gè)問(wèn)題,所以就寫(xiě)了一個(gè)基于引用技術(shù)的智能指針。該智能指針的具體實(shí)現(xiàn)方式如下:
  1#include <iostream>
  2#include <numeric>
  3#include <algorithm>
  4#include <map>
  5#include <assert.h>
  6
  8
  9using namespace std;
 10
 11template<typename T>
 12class SmartPointByRefCount
 13{
 14public:
 15    SmartPointByRefCount(T* pT) : m_pT(pT)
 16    {
 17        SmartPointByRefCount::AddRefCount((unsigned int)m_pT);
 18    }

 19
 20    SmartPointByRefCount(const SmartPointByRefCount& ref)
 21    {
 22        SmartPointByRefCount::AddRefCount((unsigned int)(ref.m_pT));
 23        m_pT = ref.m_pT;
 24    }

 25
 26    SmartPointByRefCount& operator=(const SmartPointByRefCount& ref)
 27    {
 28        if (this != &ref)
 29        {
 30            SmartPointByRefCount::AddRefCount(ref.m_pT);
 31            m_pT = ref.m_pT;
 32        }

 33
 34        return *this;
 35    }

 36
 37    ~SmartPointByRefCount()
 38    {
 39        if (SmartPointByRefCount::IsShouldDelete((unsigned int)m_pT))
 40        {
 41            SmartPointByRefCount::DelRefCount((unsigned int)m_pT);
 42            delete m_pT;
 43        }

 44        else
 45        {
 46            SmartPointByRefCount::RedRefCount((unsigned int)m_pT);
 47        }

 48    }

 49
 50    T* operator->()
 51    {
 52        return m_pT;
 53    }

 54
 55    T& operator*()
 56    {
 57        return *m_pT;
 58    }

 59
 60private:
 61    T *m_pT;
 62
 63private:
 64    static std::map<unsigned int, unsigned int> m_mapUseCount;
 65
 66public:
 67    static bool IsShouldDelete(unsigned int);
 68    static void AddRefCount(unsigned int);
 69    static void RedRefCount(unsigned int);
 70    static void DelRefCount(unsigned int);
 71}
;
 72
 73
 74template<typename T>  std::map<unsigned int, unsigned int> SmartPointByRefCount<T>::m_mapUseCount;
 75
 76template<typename T>  
 77bool SmartPointByRefCount<T>::IsShouldDelete(unsigned int nPointer)
 78{
 79    std::map<unsigned int, unsigned int>::const_iterator it = m_mapUseCount.find(nPointer);
 80    if (it != m_mapUseCount.end())
 81    {
 82        return ( 1 == it->second );
 83    }

 84    else
 85    {
 86        assert(false);
 87        return false;
 88    }

 89}

 90
 91template<typename T>  
 92void SmartPointByRefCount<T>::AddRefCount(unsigned int nPointer)
 93{
 94    std::map<unsigned int, unsigned int>::iterator it = m_mapUseCount.find(nPointer);
 95    if (it != m_mapUseCount.end())
 96    {
 97        (it->second)++;
 98    }

 99    else
100    {
101        m_mapUseCount[nPointer] = 1;
102    }

103}

104
105template<typename T>  
106void SmartPointByRefCount<T>::RedRefCount(unsigned int nPointer)
107{
108    std::map<unsigned int, unsigned int>::iterator it = m_mapUseCount.find(nPointer);
109    if (it != m_mapUseCount.end() && 1 < it->second)
110    {
111        (it->second)--;
112    }

113    else
114    {
115        assert(false);
116    }

117}

118
119template<typename T>  
120void SmartPointByRefCount<T>::DelRefCount(unsigned int nPointer)
121{
122    std::map<unsigned int, unsigned int>::iterator it = m_mapUseCount.find(nPointer);
123    if (it != m_mapUseCount.end())
124    {
125        m_mapUseCount.erase(it);
126    }

127    else
128    {
129        assert(false);
130    }

131}
        以下是測(cè)試代碼,該智能指針能夠完全通過(guò)這些測(cè)試代碼。
 1SmartPointByRefCount<int> TestSPR(SmartPointByRefCount<int> dd)
 2{
 3    *dd = 4;
 4    return dd;
 5}

 6
 7
 8int main(int argc, char *argv)
 9{
10    SmartPointByRefCount<int> spb1(new int(0));
11    SmartPointByRefCount<int> spb2 = TestSPR(spb1);
12    *spb1 = 2;
13
14    
15    {
16        SmartPointByRefCount<int> spb3(spb2);
17        SmartPointByRefCount<int> spb4 = TestSPR(spb3);
18    }

19
20    return 0;
21}

        寫(xiě)完這個(gè)智能指針之后我在網(wǎng)上找了找其他人寫(xiě)的智能指針,發(fā)現(xiàn)智能指針有兩種典型實(shí)現(xiàn)方式:侵入式、非侵入式,而我的實(shí)現(xiàn)方式是非侵入式的。以下兩篇文章是從網(wǎng)上引用的,從這兩篇文章中發(fā)現(xiàn)了一些問(wèn)題,也學(xué)到了一些知識(shí)。以下引用內(nèi)容的所有版權(quán)歸原作者所有。

第一篇:
             一種自適應(yīng)的引用計(jì)數(shù)智能指針的實(shí)現(xiàn)

0 引言
        自行管理內(nèi)存是C ++ 語(yǔ)言的一個(gè)重要特征, 它為開(kāi)發(fā)人員充分、靈活利用內(nèi)存空間提供了方 便,但同時(shí)也負(fù)擔(dān)了大量?jī)?nèi)存的請(qǐng)求、釋放工作.
 程序的邏輯錯(cuò)誤以及不確定的異常引發(fā),通常會(huì)由于內(nèi)存未釋放而造成系統(tǒng)的內(nèi)存泄漏. 實(shí)際工 作證明,內(nèi)存泄漏是最主要的C + + 程序Bug 之 一,由程序進(jìn)行自動(dòng)內(nèi)存管理可有效地避免內(nèi)存 泄漏,這也是提高C + + 程序質(zhì)量的重要途經(jīng)之 一.
自動(dòng)內(nèi)存管理通常的方式是引入垃圾回收 (Garbage Collection) 機(jī)制. 垃圾回收作為動(dòng)態(tài)語(yǔ)言 的特征之一早已存在于多種程序設(shè)計(jì)語(yǔ)言中,如 Java、Python 等. 遺憾的是最新的C ++ 標(biāo)準(zhǔn)并沒(méi)有將其引入,同時(shí),由于C ++ 語(yǔ)言是強(qiáng)類(lèi)型的靜態(tài)語(yǔ)言,通過(guò)程序來(lái)模擬垃圾回收機(jī)制非常困難,且功能有限. 避開(kāi)垃圾回收,通過(guò)運(yùn)用C ++ 語(yǔ)言的運(yùn)算符重載和范型機(jī)制,在C ++ 社區(qū)產(chǎn)生了稱(chēng)為智能指針(Smart Pointer) 的內(nèi)存工具. 所謂智能指針,實(shí)際上是一種類(lèi)模板,當(dāng)其實(shí)例化后包含有指向動(dòng)態(tài)分配內(nèi)存的指針,它通過(guò)重載* 、->運(yùn)算符來(lái)模擬指針的行為,同時(shí)在適當(dāng)?shù)臅r(shí)候釋放內(nèi)存,以達(dá)到自動(dòng)內(nèi)存管理的目的,其定義通常為template < typename T > class Smart Ptr. 現(xiàn)在,智能指針在C ++ 應(yīng)用開(kāi)發(fā)中大量使用, 已經(jīng)成為C ++ 標(biāo)準(zhǔn)的工具之一.

1   智能指針的一般實(shí)現(xiàn)和使用
 通常,智能指針按使用的策略分為兩類(lèi):一類(lèi)是面向控制資源的所有權(quán)的智能指針,這類(lèi)智能指針保證資源只被一個(gè)確定的對(duì)象使用,任何智能指針的拷貝或傳遞均會(huì)發(fā)生所有權(quán)的轉(zhuǎn)換,如標(biāo)準(zhǔn)庫(kù)提供的std : :auto ptr[1 ] ;另一類(lèi)是面向資源共享的智能指針,這類(lèi)智能指針內(nèi)部通常存在使用資源的記數(shù)器,稱(chēng)為引用計(jì)數(shù),它保證引用計(jì)數(shù)為0 時(shí)(即不再有對(duì)象使用資源) 釋放資源, 如Boost 庫(kù)的boost : :shared ptr[2 ] . 智能指針能很好的完成內(nèi)存自動(dòng)釋放,而它
 的使用與普通指針?lè)浅n?lèi)似:
 {
    ??
    //定義int 的智能指針si
       boost : :shared ptr < int > si = new int (1) ;
      //直接使用si
      std::cout<<*si<<std : :endl ;
      //定義string 的智能指針st
      boost::shared-ptr<std::string > st = new std::string(″Foo″) ;
      //通過(guò)- > 運(yùn)算符訪問(wèn)string 的成員函數(shù)
      st->clear () ;
      //qt 和st 訪問(wèn)的是同一資源
      boost : :shared ptr < std : :string > qt = st ;
      qt - > append(″Bar″) ;
       ??
       //si st 中的指針將自動(dòng)釋放
 }

 2   引用計(jì)數(shù)的實(shí)現(xiàn)
        資源共享型的智能指針引用計(jì)數(shù)的設(shè)計(jì),一般分侵入式與非侵入式兩種. 侵入式引用計(jì)數(shù),將計(jì)數(shù)器作為包含對(duì)象的一部分,該方法效率比較 高,但要求包含類(lèi)型總是繼承自一個(gè)計(jì)數(shù)對(duì)象;非侵入式引用計(jì)數(shù),計(jì)數(shù)器通過(guò)動(dòng)態(tài)內(nèi)存分配獲得,任何的對(duì)象均可作為智能指針的范型參數(shù),但小內(nèi)存的new 操作會(huì)降低智能指針的效率. 關(guān)于效率和靈活的平衡,在智能指針的設(shè)計(jì)中是不能完成的,只有把這個(gè)問(wèn)題交給智能指針的使用者. 但通過(guò)模板元編程以及模板偏特化,我們可以為使用者提供自動(dòng)識(shí)別包含類(lèi)型的智能指針[3 ] . 通過(guò)模板元編程可在程序的編譯期間判斷一個(gè)類(lèi)型是否繼承自計(jì)數(shù)對(duì)象,如果是則采用侵入式,否則采用非侵入式.侵入式的引用計(jì)數(shù)應(yīng)繼承的基類(lèi):
   class IntrusiveRefCount
   {
   //操作引用計(jì)數(shù)成員函數(shù)
   ??
   protected :
     int refCount ;PPP< 引用計(jì)數(shù)
  } ;
  通過(guò)不同的方式實(shí)現(xiàn)智能指針,模板參數(shù)IntrRefCount 缺省為T(mén)rue ,即采用侵入式:
  template < typename T,bool IntrRefCount >
  class SmartPtrImp
  {
    //重載賦值運(yùn)算符.
     //通過(guò)調(diào)用T的成員函數(shù)DecRef()和IncRef ( ) 來(lái)改變引用值
        SmartPtrImp &operator = (const SmartPtrImp &sptr)
        {
          //釋放當(dāng)前資源
          if (pointee ! = 0 &&pointee - > DecRef ( ) == 0)
             delete pointee ;
          pointee = sptr.pointee ;
          if (pointee ! = 0)
            pointee->IncRef() ;
          return *this ;
         }
         //拷貝構(gòu)造函數(shù). 同樣有引用值的操作
         SmartPtrImp (const SmartPtrImp &sptr) ;
 protected :
             T *pointee ;///對(duì)象指針
    };
   采用模板偏特化參數(shù)IntrRefCount ( 特化為false) ,此類(lèi)模板采用非侵入式模式:
   template < typename T>
   class SmartPtrImp < T,false >
   {
     //重載賦值運(yùn)算符.
   //直接new int (0) 來(lái)獲取記數(shù)器
           SmartPtrImp &operator = (T* ptr)
          {
                   if (pointee ! = 0)
                   {
                             if (--(*refCountPtr ) == 0)
                                    delete pointee ;
                           else
                           //失去了對(duì)原對(duì)象的控制,原對(duì)象的引用計(jì)數(shù)也要放棄
                               refCountPtr = new int (0) ;
                     }
                  pointee = ptr ;
                  if (pointee ! = 0)
                          ++refCountPtr ;
          return *this ;
 }
         //拷貝構(gòu)造函數(shù). 同樣有引用值的操作
         SmartPtrImp (const SmartPtrImp &sptr) ;
  protected :
         T *pointee ;///對(duì)象指針
        int *refCountPtr;///引用計(jì)數(shù)
 } ;
 
3        智能指針的實(shí)現(xiàn)
        現(xiàn)在我們需要一個(gè)算法判斷一個(gè)類(lèi)是否是另一個(gè)類(lèi)的子類(lèi)的范型算法[4 ] ,實(shí)現(xiàn)如下:
        //如果沒(méi)有看過(guò)陳偉柱翻譯的《C++ Template》的話下面的代碼可能很難看懂,如果看不懂的話,不妨找這本書(shū)看一下
         template < typename D ,typename B >
         struct IsDerivedFrom
         {
                 class No {} ;
                 class Yes {No no[2 ] ;} ;
              static Yes Test (B*) ;
           static No Test ( ?) ;
              enum {Is = sizeof (Test ( static cast <D*> (0) ) ) = = sizeof(Yes) } ;
         } ;
         如果類(lèi)型D 是B 的子類(lèi)IsDerivedFrom < D ,B>::Is 的值就為1.
         有了如上工具,我們就可以將智能指針的實(shí)現(xiàn)拼接起來(lái):
           template < typename T>
           class SmartPtr :
        public SmartPtrImp < T, IsDerivedFrom < T, IntrusiveRefCount>::Is == 1 >
           {
          typedef SmartPtrImp < T, IsDerivedFrom < T, IntrusiveRefCount>::Is == 1, Deletor < T > > ParentCls ;
        public :
         SmartPtr () :ParentCls () {}
      explicit SmartPtr (T &t) :ParentCls (t) {}
          explicit SmartPtr (T*t) :ParentCls (t) {}
       SmartPtr (const SmartPtr &sptr) :ParentCls (sptr) {}
     }

                          
        從以上的說(shuō)明上看,這篇論文只有一點(diǎn)有價(jià)值的——講明白了智能指針的兩種實(shí)現(xiàn)方式,侵入式和非侵入式。至于這篇自適應(yīng)的說(shuō)法,個(gè)人感覺(jué)在編碼的時(shí)候根本不會(huì)用到。其中紅色的文字是我添加的。


第二篇:

        指針 是C++中不得不談的一個(gè)話題,或許我還不是很能熟練的掌握指針以及我所要討論的引用計(jì)數(shù)型指針的全部,但是還是有那么些迫不及待想要表達(dá)一下。
        指針pointer 是 資源泄漏 resource leak 的根源(當(dāng)然可能還有其他一些什么東西,在我的映像中 異常 仿佛也會(huì)造成資源泄漏)最簡(jiǎn)單的一個(gè)資源泄漏的例子就是new和delete這樣的動(dòng)態(tài)內(nèi)存分配算子沒(méi)有正確使用造成的:
struct A
{
A()  { printf("A Constructor!"); }
~A() { printf("A Destructor!"); }
};

void area()
{
A *p = new A();
}
執(zhí)行完 area() 后,自然是只有A構(gòu)造的消息,而A的析構(gòu)卻不見(jiàn)影蹤。這里我們?cè)陔x開(kāi)了area作用域后,我們就無(wú)法對(duì)p所指向之資源進(jìn)行操作,A的實(shí)例就會(huì)被懸掛在內(nèi)存的某處得不到清理。一個(gè)形象點(diǎn)的比方就像人類(lèi)發(fā)送的宇宙衛(wèi)星失去了動(dòng)力以及和地球的聯(lián)系,無(wú)法收回,就變成了宇宙垃圾~。
然而利用對(duì)象來(lái)管理資源是一個(gè)很好的辦法,因?yàn)閷?duì)象的實(shí)例本身在脫離作用域后會(huì)自動(dòng)清理,就像這樣

class  A_holder
{
public:
expilict A_holder(A* p = NULL):ptr(p) {}

~A_holder()
{
if (ptr)
delete ptr;
}
private:
A* ptr;
};
如此,我們?cè)赼rea里面把資源的管理權(quán)力交給A_holder,就像下面這樣
void area()
{
A_holder ah(new A);
}
這樣,ah在離開(kāi)area后會(huì)自動(dòng)調(diào)用其析構(gòu)函數(shù),就達(dá)到了自動(dòng)管理該資源的目的。
利用C++的類(lèi)的實(shí)例離開(kāi)作用域會(huì)自動(dòng)調(diào)用其析構(gòu)函數(shù)的機(jī)制,可以比較方便的管理資源,但是在使用普通指針的情況下會(huì)存在多個(gè)指針指向同一對(duì)象的情況。
void multi_point()
{
int a;
int *p1,*p2;

p1 = &a;
p2 = &a;
}
實(shí)際的指針指向情況應(yīng)該是這樣 p1 –>? a ?<- p2。
這里就出現(xiàn)了一個(gè)問(wèn)題,我們想取消p1的時(shí)候可能會(huì)出現(xiàn)兩種語(yǔ)義:
1、將p1和其指向的對(duì)象一起刪除,這樣p2也就不可以繼續(xù)對(duì)a進(jìn)行使用。但是往往p2的使用者不會(huì)知道a已經(jīng)刪除,則出現(xiàn)了錯(cuò)誤。
2、將p1與其指向的對(duì)象解除關(guān)系,這樣p2還可以對(duì)a進(jìn)行使用。
對(duì)于普通的delete操作,實(shí)現(xiàn)的是第一種情況,這樣通過(guò)p2對(duì)a進(jìn)行訪問(wèn)必然會(huì)造成致命的錯(cuò)誤。
在實(shí)現(xiàn)holder類(lèi)的時(shí)候應(yīng)該也考慮到第二種情況,如果有另外一個(gè)holder也指向這個(gè)資源,其中一個(gè)holder銷(xiāo)毀,另外一個(gè)holder還可能會(huì)使用到它們共同指向的那個(gè)資源。于是,holder的作用就不僅僅是單單的持有和施放資源,還應(yīng)該處理有多少個(gè)對(duì)其hold資源的引用(即引用計(jì)數(shù)),并且在引用計(jì)數(shù)降為0時(shí)真正的銷(xiāo)毀資源實(shí)體。
如此,一個(gè)行為類(lèi)似指針(有->,*操作符)的智能指針出現(xiàn),它管理賦予其資源的引用計(jì)數(shù),也管理該資源的生死存亡。
一個(gè)簡(jiǎn)單的Reference Count Smart Pointer的實(shí)現(xiàn)如下:
#ifndef COUNTED_PTR_HPP
#define COUNTED_PTR_HPP
/*class for counted reference semantics
*-deletes the object to which it refers when the last CountedPtr
* that refers to it is destroyed
*/
template <class T>
class CountedPtr
{
private:
 T* ptr;        // pointer to the value
 long* count;   // shared number of owners
public:
 //initialize pointer with existing pointer
 //-requires that the pointer p is a return value of new
 explicit CountedPtr (T* p=0)
  : ptr(p), count(new long(1)) {}
 //copy pointer (one more owner)
 CountedPtr (const CountedPtr<T>& p) throw()
  : ptr(p.ptr), count(p.count)
 {
  ++*count;
 }
 //destructor (delete value if this was the last owner)
 ~CountedPtr () throw()
 {
  dispose();
 }
 //assignment (unshare old and share new value)
 CountedPtr<T>& operator= (const CountedPtr<T>& p) throw() {
  if (this != &p) {
   dispose();
   ptr = p.ptr;
   count = p.count;
   ++*count;
  }
  return *this;
 }
 //access the value to which the pointer refers
 T& operator*() const throw() {
  return *ptr;
 }
 T* operator->() const throw() {
  return ptr;
 }
private:
 void dispose() {
  if (--*count == 0) {
   delete count;
   delete ptr;
  }
 }
};
#endif /*COUNTED_PTR_HPP*/
由此,一個(gè)新的問(wèn)題出現(xiàn)了!循環(huán)引用!
這樣的一個(gè)引用計(jì)數(shù)型智能指針目的是為了防止資源泄漏,但是只需要一個(gè)很小巧的代碼就可以讓這樣的初衷化為烏有……。
class A
{
public:
 A() {cout<<"A CON"<<endl;}
 ~A() {cout<<"A DES"<<endl;}

 void hold(CountedPtr<A> ptr)
 {
  m_ptr = ptr;
 }
private:
 CountedPtr<A> m_ptr;
};

void self_cir_area()
{
 CountedPtr<A> pA(new A());
 pA->hold(pA);
}

可以看見(jiàn),一個(gè)對(duì)象A中有一個(gè)引用計(jì)數(shù)型智能指針,這樣的設(shè)計(jì)可能會(huì)很常見(jiàn)(指向自身類(lèi)型的結(jié)構(gòu)體——鏈表)
但是,當(dāng)自身循環(huán)引用發(fā)生的時(shí)候會(huì)怎么樣呢? 下面就來(lái)看看這么兩句代碼
CountedPtr<A> pA(new A());
這里我們新建一個(gè)資源,并且把這個(gè)資源的管理權(quán)移交給pA這個(gè)引用計(jì)數(shù)型智能指針對(duì)象管理。如此,pA中的引用計(jì)數(shù)被初始化為1。
pA->hold(pA);
這里,我們把pA對(duì)象傳入給實(shí)例化的A對(duì)象中的引用計(jì)數(shù)型智能指針m_ptr,m_ptr執(zhí)行這樣的一個(gè)成員函數(shù):   
//assignment (unshare old and share new value)
CountedPtr<T>& operator= (const CountedPtr<T>& p) throw() {
 if (this != &p) {
  dispose();
  ptr = p.ptr;
  count = p.count;
  ++*count;
 }
 return *this;
}
因?yàn)檫@里很明顯不是自身賦值,A中的m_ptr和pA不是同一個(gè)對(duì)象,所以進(jìn)入if結(jié)構(gòu)中調(diào)用下面的內(nèi)容。dispose是用作清理,因?yàn)閙_ptr并沒(méi)有指向任何東西,所以第一個(gè)函數(shù)并沒(méi)有真正的意義。然后
m_ptr.ptr = pA.ptr;
m_ptr.count = pA.count;
++(*m_ptr.count);  //(*pA.count)也被++
到此,pA的引用計(jì)數(shù)為2
嗯,下面就pA這個(gè)對(duì)象理所當(dāng)然的離開(kāi)了作用域,調(diào)用其析構(gòu)函數(shù):
~CountedPtr () throw() {
 dispose();
}
噢,是一個(gè)轉(zhuǎn)向,調(diào)用其private成員函數(shù)dispose():
void dispose() {
 if (--*count == 0) {
  delete count;
  delete ptr;
 }
}
很簡(jiǎn)單,將引用計(jì)數(shù)-1,由2變成1,不為0,所以if結(jié)構(gòu)內(nèi)的語(yǔ)句不被執(zhí)行。
由此,我們又制造了一個(gè)完美的太空垃圾……
這樣的循環(huán)引用問(wèn)題應(yīng)該是在設(shè)計(jì)的過(guò)程中就應(yīng)該避免的,如果用UML語(yǔ)言描述
A中持有一個(gè) 引用計(jì)數(shù)型智能指針 的語(yǔ)義就是 這個(gè) 持有關(guān)系 是需要在 A消失的時(shí)候所持有的對(duì)象也隨之消失(這正是智能指針的作用,在脫離作用域自動(dòng)清除其持有的資源)。如此就構(gòu)成了 組合 關(guān)系。如果要表示 聚合 關(guān)系,即有 部分-整體 關(guān)系但是部分不隨整體的消失而消失,這就不是 智能指針 所表達(dá)的語(yǔ)義。
還有可能遇見(jiàn)的循環(huán)引用就是 A1 持有 A2, A2 持有 A1 的情況……
這樣A1,A2中對(duì)雙方的引用計(jì)數(shù)都是2,當(dāng)一方“銷(xiāo)毀”的時(shí)候,雙方的應(yīng)用計(jì)數(shù)都變?yōu)?,實(shí)際上并沒(méi)有銷(xiāo)毀任何東西,制造了兩個(gè)完美無(wú)暇的太空垃圾~
這里又引發(fā)出一個(gè)問(wèn)題,這樣的資源泄漏問(wèn)題實(shí)際上還是由程序員自身引起的。
C++之所以是一個(gè)很容易出錯(cuò)的語(yǔ)言,很大一部分在于其資源的管理權(quán)力全權(quán)交給了程序員。這樣的權(quán)力到底是造福了程序員還是迷惑了程序員呢?
這里我卻想起了蜘蛛俠中的一句名言: “一個(gè)人能力有多大,責(zé)任就有多大!”
對(duì)C++中指針的指責(zé)不是一天兩天了,其易錯(cuò)性無(wú)可厚非,但是它卻給了你其他語(yǔ)言無(wú)法給你的能力!這就是我的觀點(diǎn),你能力有這么大,你就有責(zé)任來(lái)治理好這些資源。而非一再推卸責(zé)任。如果真的是要推卸責(zé)任,也就應(yīng)該去選擇其他那些剝奪你的能力而減少你的責(zé)任的語(yǔ)言,因?yàn)槟阌羞x擇權(quán)!就像說(shuō)英語(yǔ)和中文一樣,并沒(méi)有哪個(gè)人在強(qiáng)迫你,不是么?熱愛(ài)C++是一種態(tài)度,對(duì)一個(gè)語(yǔ)言的利弊都了然于心,了解其可以做什么不可以做什么,怎樣才可以更好的使用它來(lái)做什么,才能更好的使用它。更何況,there are rarely things that are not possible in C++。

 

在沒(méi)有看到這篇文章之前,我覺(jué)得智能指針能夠應(yīng)對(duì)所有情況,可是看過(guò)這篇文章讓我了解到智能指針在循環(huán)引用的情況下也會(huì)出現(xiàn)問(wèn)題。

另外,我還發(fā)現(xiàn)我的operator=函數(shù)有問(wèn)題,具體的問(wèn)題請(qǐng)參見(jiàn)上面兩篇文章的operator=函數(shù)。此外,本實(shí)現(xiàn)還有一些問(wèn)題沒(méi)有考慮:線程安全,if(智能指針)等。
天太晚了,所以就不排版了,請(qǐng)見(jiàn)諒!

posted on 2010-12-17 22:43 OnTheWay 閱讀(2962) 評(píng)論(3)  編輯 收藏 引用 所屬分類(lèi): 個(gè)人感悟

FeedBack:
# re: 一種基于引用計(jì)數(shù)機(jī)制的智能指針實(shí)現(xiàn)[未登錄](méi)
2010-12-17 22:55 | hdqqq
比較討厭這種引用計(jì)數(shù)指針的使用,一旦使用就意味這在所有的函數(shù)參數(shù)中必須使用指針引用或者值拷貝,一旦某些函數(shù)要求用裸指針,就可能引發(fā)問(wèn)題。  回復(fù)  更多評(píng)論
  
# re: 一種基于引用計(jì)數(shù)機(jī)制的智能指針實(shí)現(xiàn)
2010-12-18 20:38 | Phuehvk
Boost 里面有,在C++ TR1 里面也已經(jīng)有這種指針(就是來(lái)自Boost)  回復(fù)  更多評(píng)論
  
# re: 一種基于引用計(jì)數(shù)機(jī)制的智能指針實(shí)現(xiàn)
2010-12-21 19:49 | 叫我老王吧
把A *p = new A();這句換成A p;不行嗎?  回復(fù)  更多評(píng)論
  

<2010年12月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用鏈接

留言簿(4)

隨筆分類(lèi)

隨筆檔案

友情連接

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚久久调教视频| 欧美大秀在线观看| 欧美伊人久久| 蜜桃av一区二区三区| 亚洲激情成人在线| 欧美吻胸吃奶大尺度电影| 亚洲一区二区三区在线观看视频 | 亚洲一品av免费观看| 久久人人九九| 一本久道久久久| 激情亚洲网站| 国产精品丝袜白浆摸在线| 蜜桃av一区二区| 亚洲欧美日韩在线观看a三区| 免费在线看一区| 亚洲永久在线| 国产欧美精品日韩| 欧美精品在线观看91| 久久精品国产免费观看| 亚洲视频精品在线| 亚洲每日更新| 亚洲丁香婷深爱综合| 国产精品chinese| 国产精品久久久久一区| 欧美伦理一区二区| 国产欧美 在线欧美| 亚洲激情第一页| 新狼窝色av性久久久久久| 日韩亚洲精品电影| 亚洲另类视频| 亚洲国产精品久久| 黄色小说综合网站| 国产日韩欧美精品在线| 国产日韩精品久久久| 亚洲人成毛片在线播放| 亚洲第一中文字幕| 亚洲黄一区二区三区| 亚洲欧美成人一区二区在线电影| 亚洲少妇一区| 99av国产精品欲麻豆| 久久精品视频在线播放| 午夜精品久久一牛影视| 欧美一区二区三区另类| 亚洲免费视频成人| 亚洲激情av在线| 欧美国产综合一区二区| 亚洲第一福利社区| 欧美一级视频| 国产精品每日更新| 亚洲社区在线观看| 亚洲国产高清一区二区三区| 久久久九九九九| 欧美91视频| 欧美日韩精品二区| 国产精品激情偷乱一区二区∴| 国产精品成av人在线视午夜片| 亚洲国内精品在线| 蜜臀av在线播放一区二区三区 | 久久一区二区三区国产精品| 久久久久久免费| 欧美日韩一区二区三区免费| 国产精品卡一卡二| 亚洲一区二区在线| 亚洲精品久久嫩草网站秘色 | 亚洲精品资源| 欧美激情在线观看| 国产日韩欧美高清| 欧美在线观看网站| 午夜精品成人在线| 久久伊伊香蕉| 免费久久精品视频| 久久国产一区| 韩日成人在线| 欧美成人tv| 欧美激情综合亚洲一二区| 一本久久综合| 亚洲欧美99| 欧美精品激情| 99这里只有精品| 洋洋av久久久久久久一区| 久久久一区二区| 尤物99国产成人精品视频| 亚洲综合色婷婷| 亚洲欧美日韩国产综合| 欧美国产一区二区| 亚洲欧美日韩国产精品| 国产精品午夜av在线| 午夜精品婷婷| 午夜精品在线看| 欧美午夜精品久久久久久超碰| 亚洲网站在线| 亚洲日本电影在线| 欧美日韩精品中文字幕| 欧美一区二区三区在线免费观看 | 中国成人亚色综合网站| 国产精品一级久久久| 亚洲美女91| 在线亚洲免费| 在线观看精品一区| 亚洲麻豆一区| 一区免费观看| 在线亚洲欧美视频| 伊人成人网在线看| 中文国产成人精品久久一| 韩国在线视频一区| 一本久久综合| 欧美视频在线不卡| 99国内精品久久| 午夜精品福利一区二区三区av| 亚洲电影免费在线观看| 夜夜嗨av一区二区三区| 一区二区视频在线观看| 亚洲午夜精品17c| 亚洲人成绝费网站色www| 欧美在线视频观看| 亚洲综合日韩在线| 欧美激情中文不卡| 玖玖综合伊人| 鲁大师影院一区二区三区| 亚洲欧美国产毛片在线| 欧美成人一区二区三区在线观看 | 欧美激情综合五月色丁香小说| 久久久精品视频成人| 久久精品人人做人人爽电影蜜月| 99视频精品全部免费在线| 久久精品91| 欧美大片国产精品| 国产乱码精品一区二区三区五月婷| 亚洲国产精品成人| 欧美成黄导航| 欧美激情在线观看| 亚洲福利视频一区二区| 久久精品国产欧美亚洲人人爽| 欧美亚洲视频| 国产欧美一区二区精品性色| 亚洲一区美女视频在线观看免费| 一本色道久久综合亚洲精品高清| 欧美不卡高清| 亚洲国产精品一区二区www在线| 亚洲国产乱码最新视频| 另类成人小视频在线| 在线一区二区日韩| 欧美中在线观看| 欧美有码在线观看视频| 国产精品美女久久久免费| 亚洲视频 欧洲视频| 亚洲一区中文字幕在线观看| 欧美精品一区二区三区蜜桃| 亚洲精品日韩精品| 亚洲一品av免费观看| 国产精品久久久亚洲一区 | 久久激情综合| 老巨人导航500精品| 影音先锋另类| 免费一级欧美在线大片| 亚洲人成网站影音先锋播放| 正在播放欧美视频| 国产精品www网站| 午夜精品久久久久久久男人的天堂| 久久精品免费| 亚洲激情第一区| 国产精品久久久久aaaa| 欧美伊人影院| 欧美激情精品久久久久久免费印度| 欧美成人嫩草网站| 久久精品国产综合精品| 国产麻豆精品久久一二三| 午夜精品视频在线观看| 久久精品亚洲一区二区三区浴池| 一区二区三区在线免费视频| 欧美精品xxxxbbbb| 亚洲视频二区| 欧美国产成人在线| 午夜精品一区二区在线观看| 亚洲高清不卡在线| 国产精品免费观看视频| 麻豆精品精华液| 中国成人在线视频| 欧美α欧美αv大片| 午夜精品视频在线| 亚洲精品久久久久久久久久久| 亚洲男人影院| 欧美福利一区二区| 欧美影院视频| 亚洲视频在线看| 亚洲国产第一页| 国产精品午夜av在线| 欧美激情1区2区| 久久精品国产免费观看| 亚洲特级毛片| 免费欧美在线| 久久久亚洲精品一区二区三区| 一区二区三区不卡视频在线观看 | 亚洲伊人久久综合| 欧美福利小视频| 久久高清一区| 国内精品模特av私拍在线观看| 性欧美videos另类喷潮| 亚洲经典在线| 欧美激情国产日韩|