動態記憶體管理

2021-07-15 14:31:54 字數 2777 閱讀 1485

c語言使用malloc/calloc/realloc/free進行動態記憶體管理。

void

test

()c++通過new和delete動態管理記憶體。

new/delete動態管理物件。

new/delete動態管理物件陣列。

void

test

()void

test

()int

globalvar

= 1;

static

intstaticglobalvar

= 1;

void

test();

char

a2 =

"abcd"

;char*a3

="abcd"

;int*p1

= (int

*)malloc

(sizeof

(int

)*4);

int*

p2= (

int*)

calloc

(4,sizeof

(int

));int*p3

= (int

*)realloc(p2

,sizeof

(int

)*4);

free(p1

);free(p3

);int*p4

=new

int;

int*p5=

newint

(3);

int*p6=

newint

[3];

deletep4;

deletep5;

delete

p6;}

棧又叫堆疊,非靜態區域性變數/函式引數/返回值等等,棧是向下增長的。

記憶體對映段是高效的i/o對映方式,用於裝載乙個共享的動態記憶體庫。使用者可使用系統介面建立共享共享記憶體,做程序間通訊。(現在只需要了解一下)

堆用於程式執行時動態記憶體分配,堆是可以上增長的。

資料段--儲存全域性資料和靜態資料。

**段--可執行的**/唯讀常量。

【思考】

我們知道c++是相容c的,那麼已經有c庫malloc/free等來動態管理記憶體,為什麼c++還要定義new/delete運算子來動態管理記憶體?

【malloc/free和new/delete的區別和聯絡?】

它們都是動態管理記憶體的入口。

malloc/free是c/c++標準庫的函式,new/delete是c++操作符。

malloc/free只是動態分配記憶體空間/釋放空間。而new/delete除了分配空間還會呼叫建構函式和析構函式進行初始化與清理(清理成員)。

malloc/free需要手動計算型別大小且返回值會void*,new/delete可自己計算型別的大小,返回對應型別的指標。

class

array}~

array()}

private

:int*_a

;size_t

_size;};

void

test

()void * operator new (size_t size);

void  operator delete (size_t size);

void * operator new (size_t size);

void  operator delete (size_t size);

總結:operator new/operator delete operator new/operator delete 和 malloc/free用法一樣。

他們只負責分配空間/釋放空間,不會呼叫物件建構函式/析構函式來初始化/清理物件。

實際operator new和operator delete只是malloc和free的一層封裝。

呼叫operator new分配空間。

呼叫建構函式初始化物件。

呼叫析構函式清理物件

呼叫operator delete釋放空間

呼叫operator new分配空間。

呼叫n次建構函式分別初始化每個物件。

呼叫n次析構函式清理物件。(思考這裡怎麼n是怎麼來的?)

呼叫operator delete釋放空間。

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

new (place_address) type

new (place_address) type(initializer-list)

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

class

array}~

array()}

private

:int

*    _a;

size_t

_size;};

void

test

()for

(int

i= 0;

i< 10; ++i)

free(p2

);}class

array}~

array()}

private

:int

*    _a;

size_t

_size;};

void

test

()

動態記憶體管理

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

動態 記憶體管理

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

動態記憶體管理

1 malloc free和new delete之間關係和差異。共同點 他們都是動態管理記憶體的入口 不同點 1 malloc free是c c 的標準庫函式,而 new delete是c 操作符 2 malloc free使用時要自己對於型別大小進行計算,返回值為void new delete使用...