c++智慧型指標**
智慧型指標是什麼?智慧型指標運用了一種思想->raii(資源分配即初始化)
資源分配及初始化:定義乙個類來封裝資源的分配和釋放,在建構函式初始化物件,析構函式釋放物件,可以正確的初始化和釋放。
為什麼出現智慧型指標,智慧型指標能夠有效地解決異常安全問題,或者資源未被釋放,而導致記憶體洩漏。例如:中斷語句導致**跳出,導致記憶體未被釋放。
常見的智慧型指標有哪些?auto_ptr,scoped_ptr,shared_ptr,weak_ptr;
c++發展在c++98標準時出現了auto_ptr(不完善的智慧型指標):即兩個指標無法共同管理一塊相同的空間(管理權的轉移);接著在c++發展的過程中出現了boost庫,boost庫中完善了auto_ptr所不完全的功能出現了scoped_ptr(防拷貝指標);shared_ptr(引用計數);weak_ptr(不計數,與shared_ptr結合使用);
auto_ptr:
template
class autoptr
autoptr(autoptr& ap)//拷貝構造
autoptr& operator=(autoptr& ap)//賦值操作符過載(管理權的轉移)
return *this;
}t& operator*()//過載*操作符
t* operator->()//過載->操作符
~autoptr()//析構函式
private:
t* _ptr;
};
由於auto_ptr無法實現多個指標共同管理一塊記憶體空間,因此被稱為失敗的作品;在boost庫中產生了scoped_ptr,c++11中稱為unique_ptr原理差不多是相同的,在保護中只宣告賦值操作符的過載函式,和拷貝建構函式;
scoped_ptr:
template
t>
class
scopedptr
t& operator*()
t* operator->()
~scopedptr
() ;
然而這兩種指標沒有解決多個指標共同管理一塊記憶體空間,接著shared_ptr採用引用計數的方法解決了這個問題,在shared_ptr中定義乙個整型的指標,多開闢一塊空間,存放引用計數,解決在析構時,析構多次的問題。
shared_ptr:
template
t>
class
sharedptr
sharedptr
(sharedptr
& ap)
sharedptr
& operator=(const
sharedptr
& ap)
else
}return *this;
}t& operator*()
t* operator->()
~sharedptr
()
else
;
shared_ptr很好的解決了多個指標管理一塊記憶體空間,然而出現了新的問題,迴圈引用的問題,這就要結合weak_ptr來使用,舉個例子:
struct listnode
};//假設用shared_ptr來管理鍊錶
int main()
/* 這就讓p1->next指向p2,p2的引用計數p2._c就會++,
同理p1的引用計數p1._c就會++;這樣會導致在析構時,無法析構,
從而導致記憶體洩漏。*/
解決辦法是什麼呢?weak_ptr很好的解決了這個辦法:
struct listnode
};template
class weak_ptr
~weak_ptr
private:
t* _ptr
}
解決了迴圈引用問題,還有個問題shared_ptr中採用的釋放方式時delete
若想開闢一塊陣列則採用delete,當然內建型別不用delete,也不會出錯,但是若是開闢string型別的陣列則會出現問題,這就要考慮到string的物件模型了,string會在開頭多開闢四個位元組用來存放個數,然而指標釋放則不會向前便宜四個位元組,因此又採用了仿函式,用來解決不是內建型別的釋放。
仿函式:即在類中過載operator()。
template
struct less
};int main()
上面是仿函式的乙個例子,仿函式就是乙個類中過載了operator(),可以像普通函式一樣使用。
智慧型指標總結
智慧型指標採用了raii的思想方法:在建構函式初始化物件,析構函式釋放資源。
智慧型指標過載了operator*和operator->,能夠像普通指標一樣使用。
四個智慧型指標:auto_ptr;scoped_ptr;shared_ptr;每個指標有各自的特點。注意:shared_ptr,採用了weak_ptr解決迴圈引用的問題,定製仿函式解決型別析構問題。
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 智慧型指標
記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...