C 回顧之動態記憶體

2021-08-16 16:09:49 字數 1463 閱讀 1237

每個程式的記憶體空間

靜態記憶體:區域性static物件,類static資料成員以及定義在函式體外的變數

棧記憶體:函式內的非static變數

堆:動態分配(程式在執行時分配的物件,生存期由程式控制)

shared_ptr的使用

//也可以使用auto

shared_ptr

p = make_shared(10, '9');

每個shared_ptr都有乙個關聯的計數器,一旦變為0則會釋放物件。

使用動態記憶體的原因:

程式自己不知道需要多少物件

程式不知道所需物件的準確型別

程式需要在多個物件間共享資料

使用智慧型指標,在拷貝的時候拷貝智慧型指標,能保證原來的物件不被銷毀,因為指標的計數器沒有為0,同時也只是拷貝指標無須複製一遍資料。

不要混合使用智慧型指標和內建指標。如果智慧型指標和內建指標指向相同的物件,一旦智慧型指標的計數器為0,物件就被銷毀。內建指標變為空懸指標,不可再使用。

不要使用get(p.get())初始化另乙個智慧型指標或為智慧型指標賦值,否則這兩個指標指向相同物件但是是不關聯的,會導致delete兩次(分別計數器為0)。

reset的使用

shared_ptr

p = make_shared(10, '8');

shared_ptr

q = p;

if (!p.unique())

*p = "zhougb3";

cout

<< *p << " "

<< *q << endl;

刪除器函式:p指向的物件釋放時,將執行指定函式。防止在函式中間崩潰時物件消失但無法執行指定操作。p指向的物件不是動態分配的,不需要delete。

void end_connection(connection * p){}

int main()

unique_str擁有指定的物件,不支援拷貝或賦值操作。但在函式的return位置可以返回,因為編譯器知道要返回的物件即將被銷毀。

unique_ptr p(new

string("zhougb3"));

weak_ptr的作用:不會影響乙個給定物件的生命週期,也可以阻止使用者訪問乙個不再存在的物件。

智慧型指標和動態陣列

int main() );

sp.reset();//釋放

}

使用allocator類的原因:

new在一開始時就得建立大量物件,有些物件我們可能到時用不了。

在建立時就已經初始化,之後的改變都是賦值

對於某些沒有預設建構函式的類就沒辦法動態分配了。

用法

int main()

c 之動態記憶體

了解動態記憶體在 c 中是如何工作的是成為一名合格的 c 程式設計師必不可少的。c 程式中的記憶體分為兩個部分 很多時候,您無法提前預知需要多少記憶體來儲存某個定義變數中的特定資訊,所需記憶體的大小需要在執行時才能確定。在 c 中,您可以使用特殊的運算子為給定型別的變數在執行時分配堆內的記憶體,這會...

C之動態記憶體分配

在編寫程式時,通常並不知道需要處理的資料量,或者難以評估所需處理資料量的變動程度。在這種情況下,要達到有效的資源利用,必須在執行時動態地分配所需記憶體,並在使用完畢後盡早釋放不需要的記憶體,這就是動態記憶體管理原理。參考文章 1 c語言動態記憶體管理和動態記憶體分配 標準庫stdlib.h提供以下四...

C 之動態記憶體管理

想必很多學習c 的人都有很深厚的c語言基礎.在c語言中,我們是用malloc,calloc,realloc三位男士和free一位女士來動態管理記憶體的 先coding一下c語言的基本動態記憶體管理模式 void rammanagebyc 然而這種初始化方式是有很大的缺陷的 首先它的初始化非常的難受,...