c 中的記憶體分配

2021-07-23 17:57:53 字數 1010 閱讀 2905

我們一般用new和delete在堆上動態的分配和釋放記憶體。

但是我們實際去想過new是如何分配記憶體的?(至少我沒有想)

今天看了一下關於記憶體分配的知識的。得出了如下結論

new的工作原理是這樣的,先分配記憶體,在初始化物件(內建型別用值初始化,類物件用預設建構函式初始化,這裡引申一下,若乙個類沒有預設的建構函式,就無法構造動態的類物件陣列),也就是說,new的記憶體分配和物件初始化時一起。

同樣delete是先析構物件,再釋放記憶體(想想我這裡特地的說明了先後順序,其實仔細想想也是,先分配記憶體,構造物件,析構物件,釋放記憶體,就像子類物件的建立和釋放過程,先呼叫父類的建構函式,再是子類的建構函式,完了先呼叫子類的析構函式,之後才是父類是析構函式。)

但是記憶體的分配和物件的構造一起進行,在不知道具體數量的陣列中會造成一定浪費,比如我們可能會用到乙個緩衝區存放string陣列。new string[1024];實際上這已經呼叫了string的預設建構函式,構造了1024個空的string物件,但是實際上我們可能不需要那麼多的string物件。

由於new和delete在分配記憶體時,可能會有一定的浪費,引入allocator類,allocator類將記憶體的分配與物件的初始化分開,我們可以先分配一段記憶體,在需要的時候在初始化物件。

具體操作是

定義乙個allocator物件

allocator allcotortest;

allocatortest.allocate(n); //分配一段原始的,未構造的記憶體。

allocatortest.deallocatr(p, n); //釋放構造的記憶體。

allocatortest.construct(p, args); //構造物件

allocatortest.destory(p); //析構物件

思考?

1. 可以舉乙個實際的例子來演示這些函式。

2. 實際的測試一下用new和allocator的效能差異

3. new 和delete的底層實現。

4. new和malloc的區別

C 中的記憶體分配

在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區堆 堆就是那些由 new 分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個 new 就 要對應乙個 delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動 堆可以動態地擴...

C和C 中的記憶體分配

最近在課堂上聽到老師講了c語言中的記憶體分配,感覺挺深刻的,於是就寫下來,當做是對自己的提醒!微機原理的知識告訴我們,記憶體大致可以分為三部分 區 堆疊區 資料段 我的計算機學的不好,按照自己的理解 c和c 中有全域性變數,靜態變數以及區域性變數等幾類。全域性變數和靜態變數是在編譯的時候就已經分配好...

C 中記憶體分配詳解

程式執行時,特別要注意的是記憶體的分配。下面介紹c 程式設計中的記憶體分配。一 記憶體基本構成 可程式設計內存在基本上分為這樣的幾大部分 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資...