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