1. 程式人生 > 其它 >C++Learn02--C++模板的使用與智慧指標

C++Learn02--C++模板的使用與智慧指標

模板是泛型程式設計的基礎,泛型程式設計即以一種獨立於任何特定型別的方式編寫程式碼

模板是建立泛型類或函式的藍圖或公式,庫容器,比如迭代器和演算法,都是泛型程式設計的例子,它們都是使用了模板的概念。

每個容器都有一個單一的定義,比如向量,我們可以定義許多不同型別的向量 比如 Vector<int>或vector<string>

你可以使用模板來定義函式和類,接下來讓我們一起來看看如何使用。

template <typename type> ret-type func - name(parameter list)

{

//函式的主體

}

#include <iostream>

#include<string>

template <typename T>

inline T const& Max (T const& a,T const& b)

{

return a<b?b:al;

}

說智慧指標之前,我們先看一下所謂的記憶體洩露問題,

定義:在編寫應用程式的時候,程式分配了一塊記憶體,但已經不再持有引用這塊記憶體的物件(通常是指標),雖然這些記憶體被分配出去,但是無法收回,將無法被其他程序所使用,我們說這塊記憶體洩漏了,被洩露的記憶體將在整個程式宣告週期內都不可使用:

主要原因:實在使用new或malloc動態分配堆上的記憶體空間,而並未使用delete或free即使釋放掉記憶體。

一個例子:

當出現異常時,(weird_thing()返回true),delete將不再被執行,因此將導致記憶體洩漏

我們會想,當remodel這樣的函式終止(不管是正常終止,還是由於出現了異常而終止),本地變數都將自動從棧記憶體中刪除——因此指標PS佔據的記憶體將被釋放,如果PS只想的記憶體也被自動釋放,那該有多好啊。

我們知道解構函式有這個功能,如果PS有一個解構函式,該解構函式將在PS過期時自動釋放它指向的記憶體,但PS的問題在於,它只是一個常規指標,不是有解構函式的類物件指標,如果它指向的是物件,則可以在物件過期時,讓它的解構函式刪除指向的記憶體。

這裡說一下解構函式的意思:

類的解構函式是類的一種特殊的成員函式,他會在每次刪除所建立的物件時執行,解構函式的名稱與類的名稱是完全相同的,只是在前面加了個波浪號,作為字首,也不能帶有任何引數,解構函式有助於在跳出程式(比如關閉檔案,釋放記憶體等)前釋放資源

這樣的話,我夢就知道,auto_ptr,unique_ptr,shared_ptr這幾個智慧指標背後的設計思想,簡單的總結一下就是:將基本型別指標封裝為類物件指標(這個類肯定是個模板,以適應不同基本型別的需求),並在解構函式裡編寫delete語句刪除指標指向的記憶體空間

因此,要轉換remodel函式,應該按照下面3個步驟進行:

包含標頭檔案memory()智慧指標所在標頭檔案,

將指向string的指標替換為指向string的智慧指標物件;

刪除delete語句

2:三大智慧指標

shared_ptr允許多個指標指向同一個物件,Unique_ptr獨佔所指向的物件 weak_ptr shared_ptr 的弱引用

shared_ptr是一個標準的共享所有權的智慧指標,就是允許多個指標指向同一物件,shared_ptr物件中不僅有一個指標指向某某(比如int型,還擁有一個引用計數器,代表一共有多少指標指向了那個物件)

shared_ptr自動銷燬所管理的物件,每當建立一個shared_ptr的物件指向int型資料,則引用計數器值+1.每當銷燬一個shared_ptr物件,則-1,當引用計數器資料為0時,shared_ptr的解構函式會銷燬int型物件,並釋放它佔用的記憶體

weak_ptr(描述 in memory)

weak_ptr 是一種不控制所指向物件生存期的智慧指標,指向shared_ptr管理的物件,但是不影響shared_ptr的引用計數,它像shared_ptr的助手,一旦最後一個shared_ptr被銷燬,物件就被釋放,weak_ptr不影響這個過程