回顧c 基礎(2)

2021-09-28 20:51:41 字數 2056 閱讀 6649

我們知道在c++中,記憶體有五個區:堆區,棧區,自由儲存區,全域性/靜態儲存區和常量儲存區。

棧區:就是通常由編譯器在需要的時候進行分配,在不需要的時候自動清除的區域,比如區域性變數,函式引數。

堆區:就是那些由new出來的分配的記憶體塊,它們的釋放編譯器不用管,是由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,那麼程式再結束時由系統進行**。

自由儲存區:它和堆是十分類似的。不過它是由free來結束自己的。

全域性/靜態儲存區:全域性變數和靜態變數是儲存在同一記憶體中的。在以前的c語言中,全域性變數區分初始化和未初始化的。現在在c++中沒有這個區分。

常量儲存區:這是一塊特殊的儲存區,它儲存的是常量。

那麼對於堆區,我們經常會使用new/delete。但是有時確實經常忘了使用delete會造成記憶體洩漏。還有就是在還有引用使用的時候就去釋放它,往往會造成記憶體洩漏。

這時候,為了安全的使用指標,智慧型指標,它來了。

它和常規指標類似,但是它會自動地釋放所指向的記憶體。

標準庫提供的兩種智慧型指標的區別在於底層管理指標的方式不同。

shared_ptr執行多個指標指向同乙個物件。

unique_ptr則獨佔所指向的物件。

weak_ptr它是一種弱引用,它指向shared_ptr所指向的物件。

這三種智慧型指標都存放在memory中。

下面進行這三種指標的分別介紹:

1、shared_ptr:

它是c++11(原來存在於boost中)提供的乙個智慧型指標,由於它足夠智慧型,所以可以在任何地方都不使用時自動刪除使用。

從而徹底消除因其導致記憶體洩漏和懸空指標的問題。

並且它遵循共享所有權的概念,即不同的shared_ptr物件可以與相同的指標想關聯。並在內部使用引用計數機制來實現這一點。

每個shared_ptr在內部指向兩個記憶體地點:

a、指向物件的指標。

b、用於控制引用計數資料的指標。

共享所有權如何在引用計數的機制下進行工作:

當有shared_ptr的物件與指標進行關聯時,則在其建構函式中,將與此關聯的引用加1。

當任何shared_ptr超出作用域時,則在其析構函式中,與此關聯的引用見乙個。

當引用計數為0時,則說明沒有與其關聯的物件。這種情況下,它會delete刪除該記憶體。

比如建立shared_ptr物件:

std::shared_ptrp1(new int());

這段**在堆上建立了兩段記憶體:1、儲存int。2、用於引用計數的儲存的記憶體。

檢查引用計數可以用p1.use_count();

再比如:建立空的shared_ptr物件:

std::shared_ptrp1=std::make_shared();

std::make_shared一次性為int和引用計數都分配了記憶體。

要使shared_ptr取消與相關指標的關聯。可以使用reset()函式。

p1.reset();此時引用計數為減1。

p1.reset(new int(34));使用帶引數的reset()函式。因此其引用計數將再次變為1,因為它將在內部指向新指標。

2、unique_ptr:

與shared_ptr不同的是,它是乙個獨享所有權的智慧型指標。

無法進行複製構造,賦值構造,只能進行移動操作。無法使兩個相同的unique_str指向同乙個物件。

unique_ptr  它只能智慧型的指向乙個物件,如果當它能夠指向其他物件時,之前所指向的物件會被銷毀。

unique_ptr物件會在它們自身被銷毀時,使用刪除器刪除它們管理的物件。

unique_ptr支援陣列建立方法。

3、weak_ptr:

它是一種不控制物件生命週期的智慧型指標,它指向乙個shared_ptr管理的物件。進行該物件的記憶體管理的是強引用的

shared_ptr。weak_ptr只是提供了對管理物件的乙個訪問手段.,

weak_ptr 設計的目的是為配合 shared_ptr 而引入的一種智慧型指標來協助 shared_ptr 工作, 它只可以從乙個 shared_ptr 或另乙個 weak_ptr 物件構造, 它的構造和析構不會引起引用記數的增加或減少. 。

C 基礎回顧2

istream 輸入流 型別,提供輸入操作 ostream 輸出流 型別,提供輸出操作 cin 乙個istream物件,從標準輸入讀取資料 cout 乙個ostream物件,從標準輸出讀取資料 cerr 乙個ostream物件,通常用於輸出程式錯誤訊息,寫入到標準錯誤 運算子,用來從乙個istrea...

c語言基礎回顧 2

注意 字元型和整數型關係非常密切,可把字元型看做一種特殊的整型 二 常量和變數 整型常量 1.八進位制整常數八進位制整常數必須以0開頭,即以0作為八進位制數的字首。數碼取值為0 7。八進位制數通常是無符號數。2 十六進製制整常數的字首為0x或0x。其數碼取值為0 9,a f或a f。3 十進位制整常...

基礎回顧 2

string 字串常量 stringbuffer 字串變數 執行緒安全 stringbuilder 字串變數 非執行緒安全 string 型別和 stringbuffer 型別的主要效能區別其實在於 string 是不可變的物件,因此在每次對 string 型別進行改變的時候其實都等同於生成了乙個新...