2017年計(jì)算機(jī)二級(jí)C++實(shí)例編程:一個(gè)簡(jiǎn)單的智能指針實(shí)現(xiàn)

字號(hào):


    一個(gè)簡(jiǎn)單的智能指針實(shí)現(xiàn)
    學(xué)習(xí)這個(gè)代碼有助于理解shared_ptr指針的實(shí)現(xiàn)方法
    smart.cpp
    1 namespace smart
    2 {
    3 // 引用計(jì)數(shù)類.
    4 class smart_count
    5 {
    6 public:
    7 smart_count(int c = 0) : use_count(c) {}
    8 ~smart_count() {}
    9
    10 // 增加引用計(jì)數(shù), 并返回計(jì)數(shù)值.
    11 int addref() { return ++use_count; }
    12 // 減少引用計(jì)數(shù), 并返回計(jì)數(shù)值.
    13 int release() { return --use_count; }
    14
    15 private:
    16 // 計(jì)數(shù)變量.
    17 int use_count;
    18 };
    19
    20 // 智能指針.
    21 template
    22 class smart_ptr
    23 {
    24 public:
    25 // 構(gòu)造指針, 并使引用計(jì)數(shù)置為1.
    26 explicit smart_ptr (T* ptr) : p(ptr), u(new smart_count(1))
    27 {}
    28
    29 // 構(gòu)造空指針.
    30 explicit smart_ptr () : p(NULL), u(NULL)
    31 {}
    32
    33 // 智能指針析構(gòu).
    34 ~smart_ptr (void)
    35 {
    36 // 如果引用計(jì)數(shù)等于0, 則刪除數(shù)據(jù)和引用計(jì)數(shù), 并置p為NULL.
    37 // 此處需要注意的是, 共用的u并未置為 NULL, 在其它指針析構(gòu)
    38 // 時(shí), p為NULL, 則不會(huì)重復(fù)delete.
    39 if (p && u->release() <= 0)
    40 {
    41 delete p;
    42 delete u;
    43 p = NULL;
    44 }
    45 }
    46
    47 // 智能指針拷貝構(gòu)造函數(shù).
    48 smart_ptr (const smart_ptr& t)
    49 {
    50 p = t.p;
    51 u = t.u;
    52
    53 if (u) // 必須判斷空值.
    54 {
    55 u->addref(); // 增加引用計(jì)數(shù).
    56 }
    57 }
    58
    59 // 指針賦值.
    60 void operator= (smart_ptr& t)
    61 {
    62 // 首先將引用計(jì)數(shù)減1, 然后再判斷是否小于0, 如果小于0, 則delete.
    63 if (p && u->release() <= 0)
    64 {
    65 delete p;
    66 delete u;
    67 }
    68
    69 // 直接賦值.
    70 p = t.p;
    71 u = t.u;
    72
    73 if (u) // 必須判斷空值.
    74 {
    75 u->addref(); // 增加引用計(jì)數(shù).
    76 }
    77 }
    78
    79 // 重載->操作和*操作符.
    80 T *operator-> (void) { return p; }
    81 T& operator *(void) { return *p; }
    82 // 重載!操作符.
    83 bool operator! () const { return !p;}
    84
    85 // 重載指針bool值操作符.
    86 typedef smart_ptr this_type;
    87 typedef T * this_type::*unspecified_bool_type;
    88 operator unspecified_bool_type() const { return !p ? 0: &this_type::p; }
    89 // 得到原指針.
    90 T* get() { return p; }
    91 void reset(T* ptr)
    92 {
    93 // 首先將引用計(jì)數(shù)減1, 然后再判斷是否小于0, 如果小于0, 則delete.
    94 if (p && u->release() <= 0)
    95 {
    96 delete p;
    97 delete u;
    98 }
    99
    100 // 賦值, 如果是NULL, 則不創(chuàng)建引用計(jì)數(shù).
    101 p = ptr;
    102 if (p)
    103 u = new smart_count(1);
    104 else
    105 u = NULL;
    106 }
    107
    108 void reset(smart_ptr& t)
    109 {
    110 // 首先將引用計(jì)數(shù)減1, 然后再判斷是否小于0, 如果小于0, 則delete.
    111 if (p && u->release() <= 0)
    112 {
    113 delete p;
    114 delete u;
    115 }
    116
    117 // 賦值.
    118 p = t.p;
    119 u = t.u;
    120
    121 if (u) // 必須判斷空值.
    122 {
    123 u->addref(); // 增加引用計(jì)數(shù).
    124 }
    125 }
    126
    127 private:
    128 T* p;
    129 smart_count* u;
    130 };
    131
    132 // 重載==操作符.
    133 template inline bool operator==(smart_ptr & a, smart_ptr & b)
    134 {
    135 return a.get() == b.get();
    136 }
    137
    138 // 重載!=操作符.
    139 template inline bool operator!=(smart_ptr & a, smart_ptr & b)
    140 {
    141 return a.get() != b.get();
    142 }
    143 }