C 智慧型指標詳解

2021-09-24 22:08:28 字數 2808 閱讀 3597

自c++11起,c++標準提供兩大型別的智慧型指標:

1. class shared_ptr實現共享式擁有(shared ownership)概念。多個智慧型指標可以指向相同物件,該物件和其相關資源會在「最後乙個引用(reference)被銷毀」時候釋放。為了在結構複雜的情境中執行上述工作,標準庫提供了weak_ptr、bad_weak_ptr和enable_shared_from_this等輔助類。

2. class unique_ptr實現獨佔式擁有(exclusive ownership)或嚴格擁有(strict ownership)概念,保證同一時間內只有乙個智慧型指標可以指向該物件。它對於避免資源洩露(resourece leak)——例如「以new建立物件後因為發生異常而忘記呼叫delete」——特別有用。

注:c++98中的class auto_ptr在c++11中已不再建議使用。

#include #include #include #include using namespace std;

int main(void)

); // capitalize person names

(*pnico)[0] = 'n'; // 將第乙個字母換成大寫

pjutta->replace(0, 1, "j"); // 將第乙個字母換成大寫

// put them multiple times in a container

vector> whomadecoffee;

whomadecoffee.push_back(pjutta);

whomadecoffee.push_back(pjutta);

whomadecoffee.push_back(pnico);

whomadecoffee.push_back(pjutta);

whomadecoffee.push_back(pnico);

// print all elements

for (auto ptr : whomadecoffee)

cout << *ptr << " ";

cout << endl;

// overwrite a name again

*pnico = "nicolai"; // 更改pnico的名字

關於程式的幾點說明:

1)對智慧型指標pnico的拷貝是淺拷貝,所以當我們改變物件「nico」的值為「nicolai」時,指向它的指標都會指向新值。

2)指向物件「jutta」的有四個指標:pjutta和pjutta的三份被安插到容器內的拷貝,所以上述程式輸出的use_count為4。

4)shared_ptr本身提供預設記憶體釋放器(default deleter),呼叫的是delete,不過只對「由new建立起來的單一物件」起作用。當然我們也可以自己定義記憶體釋放器,就如上述程式。不過值得注意的是,預設記憶體釋放器並不能釋放陣列記憶體空間,而是要我們自己提供記憶體釋放器,如:

unique_ptr是c++標準庫自c++11起開始提供的型別。它是一種在異常發生時可幫助避免資源洩露的智慧型指標。一般而言,這個智慧型指標實現了獨佔式擁有概念,意味著它可確保乙個物件和其相應資源同一時間只被乙個指標擁有。一旦擁有者被銷毀或變成空,或開始擁有另乙個物件,先前擁有的那個物件就會被銷毀,其任何相應資源也會被釋放。

#include using namespace std;

int main()

基於引用計數的智慧型指標可以簡單實現如下(詳細解釋見程式中注釋):

#include using namespace std;

templateclass smartptr

;templatesmartptr::smartptr(t *p) : ptr(p)

catch (...)

cout << "constructor is called!" << endl;

}templatesmartptr::~smartptr()

}templatesmartptr::smartptr(const smartptr&orig)

// 過載等號函式不同於複製建構函式,即等號左邊的物件可能已經指向某塊記憶體。

// 這樣,我們就得先判斷左邊物件指向的記憶體已經被引用的次數。如果次數為1,

// 表明我們可以釋放這塊記憶體;反之則不釋放,由其他物件來釋放。

templatesmartptr& smartptr::operator=(const smartptr&rhs)

ptr = rhs.ptr;

use_count = rhs.use_count;

cout << "assignment operator overloaded is called!" << endl;

return *this;

}

智慧型指標詳解

智慧型指標就是用乙個類來封裝乙個指標 主要負責自動的來釋放記憶體,防止發生記憶體洩漏 智慧型指標中儲存的是指向動態物件的指標,用於動態物件生存週期的控制,能夠確保自動且正確的銷毀動態物件,防止記憶體洩漏。智慧型指標的主要作用就是利用棧智慧型指標離開作用域的時候呼叫析構函式釋放資源。下面我們介紹四類智...

C 智慧型指標 auto ptr 詳解

auto ptr 是c 標準庫提供的類模板,auto ptr物件通過初始化指向由new建立的動態記憶體,它是這塊記憶體的擁有者,一塊記憶體不能同時被分給兩個擁有者。當auto ptr物件生命週期結束時,其析構函式會將auto ptr物件擁有的動態記憶體自動釋放。即使發生異常,通過異常的棧展開過程也能...

c 智慧型指標基礎詳解

在現代 c 程式設計中,標準庫包含了智慧型指標 smart pointers 智慧型指標用來確保程式不會出現記憶體和資源的洩漏,並且是 異常安全 exception safe 的。智慧型指標定義在標頭檔案 memory 裡的命名空間 std 中。它對於資源獲取即初始化 raii,resource a...