c++11引入了智慧型指標的概念。。在使用普通指標,容易造成記憶體洩露或者多次釋放,因此為了更好的管理記憶體引入智慧型指標。
智慧型指標包含在標頭檔案中,包括shared_ptr、unique_ptr、weak_ptr。
1. shared_ptr
1.1 介紹
shared_ptr是一種智慧型指標,作用如同指標,但會記錄有多少shared_ptr共同指向乙個物件,這便是所謂的引用計數。一旦指向乙個物件的最後乙個指標被銷毀,那麼引用計數清空為0,這個物件會被自動刪除。
1.2 初始化
//三種初始化智慧型指標的方式
int* p = new int(30);
shared_ptrbptr(p);//通過乙個指向堆的指標進行初始化(指向棧的指標將出錯)
shared_ptraptr = make_shared(20);//通過make_shape函式初始化
shared_ptrcptr(aptr);//通過另外乙個智慧型指標初始化
cout << "aptr.use_count() = " << aptr.use_count() <<" value = "<<*aptr<1.3 賦值與獲得原始指標
//賦值
int* p = new int(30);
shared_ptrptr1 = make_shared(20);
shared_ptrptr2 = make_shared(30);
//ptr1 = p;//錯誤,不能使用普通指標給智慧型指標賦值
ptr1 = ptr2;//智慧型指標賦值
cout<< "ptr1.use_count() = "<1.4 注意事項
1.4.1 不要用原始指標初始化多個shared_ptr,否則會造成二次釋放同一記憶體;
1.4.2 避免迴圈引用,會導致無法正確釋放記憶體,導致記憶體洩露;
class b;
class a;
class b;
int main()
}
上面的**中智慧型指標pa和pb的引用計數為2,處理自身的引用外還有對方的成員中的指標。當是在while迴圈結束時,pa和pb的析構函式會被呼叫,引用計數變為1。此時這兩個物件均無法釋放自身的記憶體空間,造成記憶體洩露。
2. unique_ptr
乙個unique_ptr指標指向的物件,其他指標無法指向,即unique_ptr」唯一」擁有其所指物件。其生命週期從建立開始到離開作用域。
unique_ptr可以使用reset方法重新指定、通過move方法轉移所有權或通過relese方法釋放所有權;
int main()
//超過作用域,記憶體釋放
}
3. weak_ptr
weak_ptr是為了配合shared_ptr而引入的一種智慧型指標,但是它不具有普通指標的行為,其沒有過載操作符*和->,它最大的作用在於協助shared_ptr工作,像旁觀者那樣觀測資源的使用情況。
weak_ptr可以從乙個shared_ptr或者另外乙個weak_ptr物件構造,獲得資源的觀測權,但沒有使用權,因此它的建構函式不會引起指標引用計數的增加。
使用weak_ptr的成員函式use_count()可以觀測資源的引用計數。
weak_ptr的另乙個重要的成員函式是lock(),其可以從被觀測的shared_ptr獲得乙個可用的shared_ptr物件,從而操作資源。
shared_ptrsh_ptr = make_shared(10);
coutcout*sh_ptr = 100;
cout《將1.4.2中兩個類內部的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 智慧型指標
記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...