作業系統是執行在系統上的軟體。負責程序管理,儲存管理,裝置管理,檔案管理等系統功能。具有併發,共享,隨機三個主要特徵。然而儲存管理的核心是合理分配記憶體空間。記憶體是可被處理器直接訪問到的,處理器是按照絕對位址訪問,但使用者程式是按照邏輯位址分配。如何進行記憶體的管理保證cpu執行指令時正確訪問儲存空間,就需要有儲存管理方案,如分割槽管理,分頁管理,分段管理,段頁管理。作業系統借助虛擬儲存空間,合理利用外存擴充記憶體。因此每個程序都會分配一塊記憶體區。如下圖:
棧空間由虛存管理,堆空間由使用者**控制。
int * ptest = ( int*) malloc(10 * sizeof( int));
2.calloc: 該函式會將申請的記憶體空間初始化為0;
int * ptest1 = ( int*) calloc(10, sizeof( int));
3. rellock:改變原有記憶體空間大小,,若不能改變,則將會開闢一段新的記憶體,將原有記憶體的內容拷貝過去, 但不會對新開闢的空間進行初始化;
int * ptest2 = ( int*) malloc(10 * sizeof( int));
注意:堆上的記憶體需要使用者自己來管理,動態malloc/calloc/realloc的空間,必須free掉,否則會造成記憶體洩露;棧上空間具有函式作用域,在函式結束後系統自動**,不用使用者管理。
使用_alloc在棧上動態開闢記憶體,棧上開闢的記憶體由編譯器自動維護,不需要使用者顯式釋放。
使用new,delete進行管理。
new和delete、new和delete一定匹配使用,一定匹配使用。
執行new表示式實際上執行了三步操作:
int *p1 = new int(3);//堆上開闢了乙個int物件,初始值為3
int *p2 = new int[5];//堆上分配5個預設初始化的int物件
1.呼叫operator new 或者(operator new)的標準庫函式;該函式分配一塊足夠大的,原始的,未命名的記憶體空間。
2.編譯器執行相應的建構函式以構造物件並傳入初始值。
3.物件分配空間並完成構造,返回乙個指向該物件的指標。
執行delete表示式刪除乙個動態分配的物件時執行兩步操作:
delete p1;//銷毀*p1,然後釋放所指向的空間
delete p2;//逆向銷毀*p2,然後釋放所指向的空間
1.對指向的物件或陣列的元素執行對應的析構函式(陣列逆向析構);
2.呼叫operator delete或者(operator delete)的標準庫函式釋放空間;
1. 它們都是動態管理記憶體的入口。
2. malloc/free是c/c++標準庫的函式,new/delete是c++操作符。
3. malloc/free只是動態分配記憶體空間/釋放空間。而new/delete除了分配空間還會呼叫建構函式和析構函式進行初始化與清理(清理成員)。
4. malloc/free需要手動計算型別大小且返回值會void*,new/delete可自己計算型別的大小,返回對應型別的指標。
C 動態記憶體管理
我們都知道在c 中可以用new malloc動態分配記憶體空間,delete free釋放動態開闢的記憶體空間。1.那麼既然c 中有了可以動態開闢記憶體的函式為什麼又要有new delete呢?c 中的malloc free是繼承c語言中的malloc free,它的用法和在c語言中的用法一模一樣。...
C 動態記憶體管理
1 總結並剖析malloc free和new delete之間關係和差異。1 他們都是動態記憶體管理的入口 2 malloc要計算空間大小,返回值要強轉 new自動計算位元組大小,返回值是相應型別的指標 3 malloc只開闢空間 new開闢空間 呼叫建構函式初始化 delete呼叫析構函式清理 釋...
c 動態記憶體管理
c語言動態記憶體管理 c中關於動態記憶體的標準庫函式 malloc calloc realloc free 以下是關於這幾個函式的介紹 1 malloc 用於動態開闢記憶體 堆空間 返回型別為void 引數 size t size 是無符號整型表示要開闢的空間大小,單位是位元組,2 calloc 用...