C 之動態記憶體及智慧型指標重點總結

2021-09-11 01:50:11 字數 2704 閱讀 2170

區域性static物件在第一次使用前分配,在程式結束時銷毀。區域性自動物件在第一次使用前分配,在程式結束時銷毀。全域性物件在程式啟動時分配,在程式結束時銷毀。

程式用堆來儲存動態分配的物件-即那些在程式執行時分配的物件。動態物件的生存期由程式控制,也就是說,當動態物件不再使用時,必須顯式的銷毀他們。

一旦乙個shared_ptr的計數器變為0,它就會自動釋放自己所管理的物件。

我們為strblob定義了乙個名為check的private工具函式,它檢查乙個給定索引是否在合法範圍內,除了索引,check還接受乙個string引數,他會將此引數出傳遞給異常處理程式,這個string描述了錯誤內容。

值初始化只需在型別名後面加一對空括號即可。而預設初始化不需要加東西。

出於與變數初始化相同的原因,對動態分配的物件進行初始化農場是個好主意。

unique_ptr「唯一」擁有其所指物件,同一時刻只能有乙個unique_ptr指向給定物件(通過禁止拷貝語義、只有移動語義來實現)。相比與原始指標unique_ptr用於其raii的特性,使得在出現異常的情況下,動態資源能得到釋放。unique_ptr指標本身的生命週期:從unique_ptr指標建立時開始,直到離開作用域。離開作用域時,若其指向物件,則將其所指物件銷毀(預設使用delete操作符,使用者可指定其他操作)。unique_ptr指標與其所指物件的關係:在智慧型指標生命週期內,可以改變智慧型指標所指物件,如建立智慧型指標時通過建構函式指定、通過reset方法重新指定、通過release方法釋放所有權、通過移動語義轉移所有權。

由於乙個unique_ptr擁有它指向的物件,因此unique_ptr不支援普通的拷貝或者賦值操作。因此如果希望將p2初始化為p1,則不能使用unique_ptrp2(p1);,因為unique_ptr不支援拷貝和賦值;正確的做法是unique_ptrp2(p1.release());這裡p2被初始化為p1原來儲存的指標,而p1被置位空。

但是要注意的是:不能拷貝unique_ptr的規則有乙個例外:我們拷貝或者複製乙個將要被銷毀的unique_ptr,最常見的例子是從函式返回unique_ptr

unique_ptru1 和unique_ptru2(d)

//空unique_ptr,可以指向型別為t的物件,u1會使用delete來釋放它的指標。u2會使用乙個型別為d的可呼叫物件來釋放它的指標

unique_ptru(d) 空unique_ptr指向型別為t的物件用型別為d的物件d來代替dlete

u=nullptr 釋放u指向的物件,將u置為空

u.release() u放棄對指標的控制權,返回指標,並將u置為空

u.reset() u.reset(q) u.reset(nullptr)

// 釋放u指向的物件,如果提供了內建指標,令u指向這個物件,否則將u置為空。

auto p=make_shared(42);

weak_ptrwp(p);

大多數應用應該使用標準庫容器而不是動態分配的陣列。使用容器更為簡單、更不容易出現記憶體管理錯誤並且可能有更好的效能。

int *pia=new int [get_size()];//pia指向第乙個int 方括號中的大小必須是整型但不必是常量。

typedef int arrt[42]

int *p=new arrt; //分配乙個42個int的陣列,p指向第乙個int 這裡雖然沒有方括號,但是由於使用了型別別名,所以實際在編譯器執行這個表示式時還是使用了new

為了釋放動態陣列,我們使用一種特殊形式的delete-指標前面加上乙個空方括號對 (!很重要)

delete p;//p必須指向乙個動態分配的物件或為空

delete pa;//pa必須指向乙個動態分配的陣列或為空

標準庫allocator類及其演算法

allocatora 定義了乙個名為allocator物件,它可以為型別為t的物件分配記憶體

a.allocate(n) 分配一段原始的未構造的,儲存n個型別為t的物件

a.deallocate(p,n) 釋放從t*指標p中位址開始的記憶體,這塊記憶體儲存了n個型別為t的物件

a.construct(p,args) p必須是乙個型別為t*的指標,指向一塊原始記憶體,arg被傳遞給型別為t的建構函式,用來在p指向的記憶體中構造乙個物件

a.destory(p) p為t*型別的指標,此演算法對p指向的物件執行析構函式

為了使用allocate返回的記憶體,我們必須使用construct構造物件。使用未構造的記憶體,其行為是未定義的。在我們用完物件後必須對每個構造函式呼叫destroy來摧毀它們,我們只能對真正構造了的元素進行destory操作。

開始乙個程式的設計的一種好的方法是列出程式的操作,了解需要哪些操作會幫助我們分析出需要什麼樣的資料結構,從需求入手,我們的文字查詢程式需要完成什麼任務,然後找出需要的標準庫。

當我們設計乙個類時,在真正實現成員之前先編寫程式使用這個類,是一種很常用的方法,通過這種方法可以看到類是否具有我們所需要的操作。

C 動態記憶體與智慧型指標

qq 1841545843 郵箱 jiaxx903 163.com 靜態記憶體用來儲存區域性 static 物件 類的 static 資料成員,以及定義在任何函式之外的變數。棧記憶體用來儲存定義在函式之內的 static 物件。除了棧記憶體和靜態記憶體外,每個程式還擁有乙個記憶體池,這部分稱之為 堆...

c 動態記憶體與智慧型指標

目前為止我們學過靜態記憶體和棧記憶體,分配在其中的物件由編譯器自動建立和銷毀,靜態記憶體 用來儲存區域性static物件 類的static資料成員 以及定義在任何函式體之外的變數。在物件使用之前分配,程式結束時銷毀。棧記憶體 用來儲存定義在函式內的非static物件。僅在物件定義的程式塊執行時存在,...

動態記憶體與智慧型指標

動態記憶體與智慧型指標 靜態記憶體用來儲存區域性static物件 類static資料成員以及定義在任何函式之外的變數 全域性變數 棧記憶體用來儲存定義在函式內的非static物件。分配在靜態或棧記憶體中的物件由編譯器自動建立和銷毀。對於棧物件,僅在其定義的程式塊執行時才存在 static物件在使用之...