動態記憶體管理

2021-09-01 06:23:56 字數 2479 閱讀 3753

一、記憶體分布

先看c++中程式記憶體區域劃分。

1.棧又稱為堆疊,非靜態區域性變數/函式引數/返回值等;

2.記憶體對映是高效i/o對映方式,用作程序間通訊;

3.堆用於動態記憶體分配;

4.資料段儲存全域性資料和靜態資料;

5.**段一般就是可執行**;

6.核心是使用者不能操作的那部分。

二、c++和c語言的動態記憶體管理

在c語言中我們都知道,c語言的動態記憶體管理一般用malloc/realloc/calloc 三種增容方式,free一種釋放方式,c++中動態記憶體開闢方式只有一種方式,new和delete這一組,但是他有兩種格式。

malloc、realloc和calloc的區別

(1)malloc不能初始化所申請的記憶體空間,而calloc能夠。

(2)realloc可以對給定的指標所指的空間進行擴大或者縮小,無論是擴張或是縮小,原有記憶體的中內容將保持不變.當然,新申請的空間的大小如果小於原來的大小,就會導致資料丟失。

(3)realloc申請的記憶體後面還有足夠多剩餘記憶體的話,realloc的記憶體=原來的記憶體+剩餘記憶體,realloc還是返回原來記憶體的位址; 假如原來的記憶體後面沒有足夠多剩餘記憶體的話,realloc將申請新的記憶體,然後把原來的記憶體資料拷貝到新記憶體裡,原來的記憶體將被free掉,realloc返回新記憶體的位址。當給realloc設定的引數指標若為null或者0時就相當於malloc的作用

(4)calloc所申請的空間內容初始化,如果你是為字元型別或整數型別的元素分配記憶體,那麼這些元素將保證會被初始化為0;如果你是為指標型別的元素分配記憶體,那麼這些元素通常會被初始化為空指標;如果你為實型資料分配記憶體,則這些元素會被初始化為浮點型的零.

class test

static int getsum()

static void resetsum()

private:

static int _count;

static int _sum;

}; int sum_solution(int n) };

int test::sum::_count = 0;

int test::sum::_sum = 0;

int main()

class test

~test()

private:

test(int date)

test(const test& d);

private:

int _date;

};int main()

一共有這樣兩種動態記憶體增容方式,new/delete內部結構和new/delete是一樣的,但是他們的不同在與,new是開闢一段連續空間,而new開闢的是單個元素的空間。這兩種不能混合使用,必須對應著使用。

三、operator new/operator delete全域性函式

注意一點,new/delete只是c++中給出的操作符,並不是函式,new在底層呼叫operator+new全域性函式來申請空間,delete在底層呼叫operator+delete全域性函式來釋放空間。

void test2() 

/* operator new:該函式實際通過malloc來申請空間,當malloc申請空間成功時直接返回;申請空間失敗,嘗試 執行空間不足應對措施,如果改應對措施使用者設定了,則繼續申請,否則拋異常。 */

void *__crtdecl operator new(size_t size) _throw1(_std bad_alloc)

return (p); }

/* operator delete: 該函式最終是通過free來釋放空間的 */

void operator delete(void *puserdata)

通過上述兩個全域性函式就可以知道,new也是用malloc來申請空間,不過new是公升級過的malloc。

四、定位new表示式

定位new表示式是在已分配的原始記憶體空間中呼叫建構函式初始化乙個物件。

使用格式:

new (place_address) type或者new (place_address) type(initializer-list)

place_address必須是乙個指標,initializer-list是型別的初始化列表

使用場景:

定位new表示式在實際中一般是配合記憶體池使用,因為記憶體池分配出的記憶體是沒有初始化的,所以如果是自定義型別的物件,需要使用new的定義表示式進行顯示調建構函式進行初始化。

class t

~t()

private:

int _data;

};void test()

int main()

動態記憶體管理

首先應該明白物件的三種內部的儲存方式 自動儲存,靜態儲存,和動態儲存。當執行離開當期程式塊的時候,堆疊指標返回到它進入程式塊 之前的地方,有效的銷毀了那個程式塊的自動變數。重新進入這個塊會再次建立所有的自動變數。靜態物件宣告或者在檔案域中。動態物件是存在系統呼叫 的在執行期中建立並且儲存在堆中,這是...

動態 記憶體管理

定義變數時,必須制定其資料型別和名字。而動態建立物件時,只需指定其資料型別,而不必為該物件命名。取而代之的是,new表示式返回指向新建立物件的指標,我們通過該指標來訪問此物件。int i int pi new int 這個new表示式在自由儲存區中分配建立了乙個整型物件,並返回此物件的位址,並用該位...

動態記憶體管理

c語言使用malloc calloc realloc free進行動態記憶體管理。void test c 通過new和delete動態管理記憶體。new delete動態管理物件。new delete動態管理物件陣列。void test void test int globalvar 1 stati...