c 11 智慧型指標

2021-08-02 10:55:38 字數 2024 閱讀 7020

首先來看shared_ptr,先貼一小部分vs2013裡的實現

// template class shared_ptr

template

class

shared_ptr

: public _ptr_base<_ty>

template

explicit

shared_ptr(_ux *_px)

template

class _dx>

shared_ptr(_ux *_px, _dx _dt)

shared_ptr(nullptr_t)

......

}

我們可以看到shared_ptr首先繼承了_ptr_base。把_ptr_base部分**貼上來

// template class _ptr_base

template

class _ptr_base

_ptr_base(_myt&& _right)

: _ptr(0), _rep(0)

template

_ptr_base(_ptr_base<_ty2>&& _right)

: _ptr(_right._ptr), _rep(_right._rep)

_myt& operator=(_myt&& _right)

private:

_ty *_ptr;

_ref_count_base *_rep;

template

friend

class _ptr_base;

}

可以發現_ptr就是用來儲存原始指標的變數,_rep是_ref_count_base型別的指標,根據變數名大概就是引用計數了。再把_ref_count_base的**貼上來

// class _ref_count_base

class _ref_count_base

public:

virtual ~_ref_count_base() _noexcept

bool _incref_nz()

}unsigned

int _get_uses() const

void _incref()

void _incwref()

void _decref()

}void _decwref()

long _use_count() const

bool _expired() const

virtual

void *_get_deleter(const _xstd2 type_info&) const

};

比較短就全貼上來了,可以看到_uses和_weaks都被初始化成1。當我們平時使用 std::shared_ptr a(new int(1)) 這種形式,shared_ptr會使用_resetp()來初始化。把_resetp()**貼上來

templatevoid _resetp(_ux *_px)

...public:

template

void _resetp0(_ux *_px, _ref_count_base *_rx)

....

// template class _ref_count

templateclass _ref_count

: public _ref_count_base

private:

virtual

void _destroy()

virtual

void _delete_this()

_ty * _ptr;

};....

void _reset0(_ty *_other_ptr, _ref_count_base *_other_rep)

可以看到最終在_reset0中原始指標和在堆中的引用計數的指標都被儲存下來,乙個有趣的發現在引用計數中還儲存著乙份原始指標,有時間再慢慢探索。

C 11智慧型指標

本文介紹c 的四種智慧型指標,其中後三種是c 11新增加的,auto ptr已被棄用。要編譯c 11,需要安裝g 4.8 sudo add apt repository ppa ubuntu toolchain r test sudo apt get update sudo apt get inst...

c 11 智慧型指標

如果在程式中使用new從堆 自由儲存區 分配記憶體,等到不需要時,應使用delete將其釋放。c 引入了智慧型指標auto ptr,以幫助自動完成這個過程。c 11摒棄了auto ptr,並新增了三種智慧型指標 unique ptr,shared ptr,weak ptr。一.auto ptr,un...

C 11 智慧型指標

c 11中有unique ptr shared ptr與weak ptr等智慧型指標 smart pointer 定義在 memory 中。可以對動態資源進行管理,保證任何情況下,已構造的物件最終會銷毀,即它的析構函式最終會被呼叫。unique ptr持有對物件的獨有權,同一時刻只能有乙個uniqu...