c 動態記憶體管理

2021-08-21 19:13:46 字數 1927 閱讀 8762

c語言中使用malloc(進行動態開闢空間)、calloc(動態開闢空間,函式在返回前把記憶體初始化為0)、realloc(用於增容,用於修改乙個原先已經分配的記憶體塊大小)、free進行動態記憶體管理

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

new/delete動態管理物件

new/delete動態管理物件組

void test()

new和delete:操作符 int:型別 (3):初始化為3 [3]:物件個數為3

1. 對於內建型別:new和malloc本還沒有區別

2. 對於自定義型別:malloc動態開闢空間;new 動態開闢空間、呼叫建構函式(初始化)、呼叫析構函式(清理)

注意!malloc/free、new/delete、new/delete,一定要匹配使用,否則可能出現記憶體洩漏的問題

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

記憶體對映區:高效的i/o對映方式,用來裝在乙個共享的動態記憶體庫

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

資料段:儲存全域性資料和靜態資料

**段:可執行的**/唯讀常量

保護實體地址

擴大空間,實體地址不夠用

方便實現了父子程序的通訊

static

int a=10;

int b=10;

void func()

nul位元組是字串的終止符,但本身並不是字串的一部分,字串的長度不包括nul

1.strlen(p1)=5

2. strlrn(p2)=5

3.sizeof(p1)=4或8 p1為指標,在32平台為4,64為平台為8

4.sizeof(p2)=6 陣列的大小,包括/0

a:棧(非靜態區域性變數,函式引數,返回值) b:堆(動態記憶體分配) c:資料段(全域性資料和靜態資料) d:**段(常量區)

a c 靜態資料

b c 全域性資料

c c 靜態資料

d a 非靜態區域性變數

p1 a 區域性指標變數

p2 a 區域性陣列

p3 a 區域性指標變數

*p1 d

*p2 a

*p3 b 動態記憶體分配

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

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

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

malloc/free只是動態分配記憶體空間、釋放空間(malloc只是開闢了與物件具有相同大小的記憶體塊空間)。而new/delete除了分配空間還會呼叫建構函式和析構函式進行初始化與清理(new呼叫建構函式來建立物件)

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

malloc失敗,返回0;new失敗,丟擲異常

new做了兩件事:

呼叫operator new 分配空間

呼叫建構函式初始化物件

delete也做了兩件事:

呼叫析構函式清理物件

呼叫operator delete釋放空間

new[n]

呼叫operator new 分配空間

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

delete[n]

1. 呼叫n次析構函式清理物件

2. 呼叫operator delete釋放空間

什麼是記憶體洩漏:在堆上申請的空間沒有釋放

如何避免:良好的程式設計習慣,使用系統自帶的工具(vs下crtdbg),自己實現檢測工具,第三方檢測工具

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 用...