C 智慧型指標

2021-09-19 06:00:23 字數 3288 閱讀 8580

智慧型指標,即智慧型指標物件,實現了自主的記憶體**機制。

智慧型指標的分類:

1. auto_ptr

一塊堆記憶體 只要有乙個智慧型指標擁有所有權  

部分原始碼如下:

templateclass auto_ptr

auto_ptr(const auto_ptr& rhs)

auto_ptr& operator=(const auto_ptr& rhs)

return *this;

} ~auto_ptr()

mptr = null;

} t& operator*()

t* operator->()

private:

void release()const

t* mptr;

};

2.帶標誌位的智慧型指標

所有權不唯一,釋放權唯一。

舊的智慧型指標有釋放權 -> 新的智慧型指標就有釋放權

舊的智慧型指標無釋放權 -> 新的智慧型指標無釋放權

舊的智慧型指標賦值後肯定沒有釋放權

即:this->flag = rhs.flag;

rhs.flag = false;

(帶標誌位的智慧型指標實際是對auto_ptr的改進)

部分原始碼如下:

templateclass smartptr

~smartptr()

mptr = null;

} smartptr(const smartptr& rhs)

smartptr& operator=(const smartptr& rhs)

mptr = rhs.mptr;

this->flag = rhs.flag;

rhs.flag = false;

} return *this;

} t& operator*()

t* operator->()

private:

t* mptr;

mutable bool flag;//是否擁有釋放權 true 有 false 無

};

帶標誌位的智慧型指標存在的問題:

由於所有權的轉移,可能使記憶體提前釋放,導致其他的智慧型指標失效。

3.scoped_ptr

乙個堆記憶體只能有乙個智慧型指標來引用。(是最簡單的智慧型指標)

為了防止拷貝帶來的問題,scoped_ptr從根本上就不允許拷貝和賦值,即禁止使用拷貝建構函式和賦值運算子的過載函式。

部分原始碼如下:

templateclass scope_ptr

~scope_ptr()

t& operator*()

t* operator->()

//將拷貝建構函式和賦值運算子的過載函式寫在私有成員下,從而「防拷貝,防賦值」

private:

scope_ptr(const scope_ptr&);

scope_ptr& operator=(const scope_ptr&);

t* mptr;

};

4. shared_ptr

強智慧型指標,允許多個智慧型指標指向同乙個物件。引用計數管理器來管理指向物件的智慧型指標。

部分原始碼如下:

//引用計數管理器

class ref_management

ref_management(const ref_management&);

public:

static ref_management* getinstance()

public:

void addref(void* ptr) //增加計數

else

}void delref(void* ptr) //刪除計數

else

}} int getref(void* ptr) //得到計數

return node[idx].ref;

}private:

int findaddr(void* ptr) //查詢計數

}return rt;

} class node

public:

void* ptr;//堆記憶體的位址

int ref; //對應的引用計數

}; node node[10];

int index;

static ref_management rm;

};ref_management ref_management::rm;

//強智慧型指標

templateclass shared_ptr

shared_ptr(const shared_ptr& rhs) :mptr(rhs.mptr)

shared_ptr& operator=(const shared_ptr& rhs)

mptr = rhs.mptr;

prm->addref(mptr);

} return *this;

} ~shared_ptr()

mptr = null;

} t& operator*()

t* operator->()

t* getptr()const

private:

t* mptr;

static ref_management* prm;

};templateref_management* shared_ptr::prm = ref_management::getinstance();

shared_ptr存在的問題:

強智慧型指標的相互引用,使指標無法釋放,導致記憶體洩漏。

5.weak_ptr

由於強智慧型指標的相互引用問題,由此引出弱智能指標。

weak_ptr不加引用計數,不能釋放記憶體,不能單獨使用,要結合shared_ptr使用

部分原始碼如下:

templateclass weak_ptr

weak_ptr(const weak_ptr& rhs) :mptr(rhs.mptr){}

weak_ptr& operator=(const shared_ptr& rhs) //weak_ptr不能單獨使用,要結合shared_ptr使用

~weak_ptr(){}

private:

t* mptr;

};

c 智慧型指標

auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...

c 智慧型指標

很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...

c 智慧型指標

記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...