C C 動態記憶體管理

2021-09-19 19:00:32 字數 4277 閱讀 8929

語言中的動態記憶體管理

//malloc/calloc/realloc/free

#if 0

#includeint main()

#endif

動態記憶體管理

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

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

//3. malloc / free只是動態分配記憶體空間 / 釋放空間。

//而new / delete除了分配空間還會呼叫建構函式和析構函式進行初始化與清理(清理 成員)。

//4. malloc / free需要手動計算型別大小且返回值會void * ,new / delete可自己計算型別的大小,

//返回對應型別的指標。

#if 0

int main()

//申請和釋放單個元素的空間,使用new和delete操作符,

//申請和釋放連續的空間,使用new和 delete

#endif

和delete操作自定義型別

#if 0

class test

~test()

private:

int _data;

};//mallco/free

void test1()

//new 和delete

//在申請自定義型別的空間時,new會呼叫建構函式,delete會呼叫析構函式,

//而malloc與free不會

void test2()

int main()

#endif

new 和 operator delete函式

//new和delete是使用者進行動態記憶體申請和釋放的操作符,

//operator new 和operator delete是系統提供的 全域性函式,

//new在底層呼叫operator new全域性函式來申請空間,

//delete在底層通過operator delete全域性 函式來釋放空間。

//通過上述兩個全域性函式的實現知道,operator new 實際也是通過malloc來申請空間,

//如果malloc申請空間 成功就直接返回,否則執行使用者提供的空間不足應對措施,

//如果使用者提供該措施就繼續申請,否則就拋異 常。

//operator delete 最終是通過free來釋放空間的

#if 0

struct listnode

void operator delete(void* p) };

class list

~list()

delete _head;

_head = nullptr;

}private:

listnode* _head;

};int main()

#endif

和delete的實現原理

//如果申請的是內建型別的空間,new和malloc,delete和free基本類似,

//不同的地方是:new / delete申請和 釋放的是單個元素的空間,

//new和delete申請的是連續空間,而且new在申請空間失敗時會拋異常,

//malloc會返回null

//自定義型別

//new的原理

//1. 呼叫operator new函式申請空間

//2. 在申請的空間上執行建構函式,完成物件的構造

////delete的原理

//1. 在空間上執行析構函式,完成物件中資源的清理工作

//2. 呼叫operator delete函式釋放物件的空間

////new t[n]的原理

//1. 呼叫operator new函式,在operator new中實際呼叫

//operator new函式完成n個物件空間的申請

//2. 在申請的空間上執行n次建構函式

////delete的原理

//1. 在釋放的物件空間上執行n次析構函式,完成n個物件中資源的清理

//2. 呼叫operator delete釋放空間,實際在operator delete中呼叫

//operator delete來釋放空間

#if 0

//6.定位new表示式(placement-new)

class test

~test()

private:

int _data;

};int main()

#endif

//malloc / free和new / delete的區別

//malloc / free和new / delete的共同點是:

//都是從堆上申請空間,並且需要使用者手動釋放。

////不同的地方是:

//1. malloc和free是函式,new和delete是操作符

//2. malloc申請的空間不會初始化,new可以初始化

//3. malloc申請空間時,需要手動計算空間大小並傳遞,new只需在其後跟上空間的型別即可

//4. malloc的返回值為void*, 在使用時必須強轉,new不需要,因為new後跟的是空間的型別

//5. malloc申請空間失敗時,返回的是null,因此使用時必須判空,new不需要,但是new需要捕獲異常

//6. 申請自定義型別物件時,malloc / free只會開闢空間,不會呼叫建構函式與析構函式,

//而new在申請空間 後會呼叫建構函式完成物件的初始化,delete在釋放空間前會呼叫析構函式完成空間中資源的清理

//7. new / delete比malloc和free的效率稍微低點,因為new / delete的底層封裝了malloc / free

//7.設計乙個類,該類只能在堆上建立物件

//方法一:建構函式私有化

//1. 將類的建構函式私有,拷貝構造宣告成私有。防止別人呼叫拷貝在棧上生成物件。

//2. 提供乙個靜態的成員函式,在該靜態成員函式中完成堆物件的建立

#if 0

class heaponly

private:

heaponly(){}

//c++98

//1.只宣告不實現。因為實現可能會很麻煩,而你本身不需要

//2.宣告成私有的

heaponly(const heaponly& h);

//c++11

heaponly(const heaponly& h) = delete;

};//請設計乙個類,該類只能在棧上建立物件

class stackonly

private:

stackonly() {};

};//or

//只能在棧上建立物件,即不能在堆上建立,因此只要將new的功能遮蔽掉即可,

//即遮蔽掉operator new和定 位new表示式,

//注意:遮蔽了operator new,實際也將定位new遮蔽掉。

class stackonly

;#endif

//8.記憶體洩漏

//記憶體洩漏指因為疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況。

//記憶體洩漏並不是指內存在物理上的消失,而是應用程式分配某段記憶體後,

//因為設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。

#if 0

int main()

#endif

//c / c++程式中一般我們關心兩種方面的記憶體洩漏:

////堆記憶體洩漏(heap leak)

//堆記憶體指的是程式執行中依據須要分配通過malloc / calloc / realloc / new等

//從堆中分配的一塊記憶體, 用完後必須通過呼叫相應的 free或者delete 刪掉。

//假設程式的設計錯誤導致這部分記憶體沒有被釋放,那麼以後這部分空間將無法再被使用,

//就會產生heap leak。

////系統資源洩漏

//指程式使用系統分配的資源,比方套接字、檔案描述符、管道等沒有使用對應的函式釋放掉,

//導致系統資源的浪費,嚴重可導致系統效能減少,系統執行不穩定。

#if 0

//一次在堆上申請4g的記憶體

//將程式編譯成x64的程序

int main()

#endif

C C 動態記憶體管理

一 c語言中動態記憶體管理方式 c語言中使用 malloc calloc realloc free進行記憶體的管理和釋放 1.malloc動態記憶體申請 int ptest int malloc 10 sizeof int 申請記憶體的方式 free 釋放 2.calloc 該函式會將申請的記憶體空...

C C 動態記憶體管理

注意malloc free new delete new delete一定要匹配使用,否則可能出現記憶體洩漏甚至崩潰的問題小結 1 兩組函式都負責動態記憶體管理 2 malloc free是c c 標準庫的函式,而new delete是c 操作符。3 malloc free只負責動態分配空間 釋放空...

C C 動態記憶體管理

c語言動態記憶體管理 malloc calloc realloc free int p1 int malloc sizeof int malloc返回值型別為void int p2 int calloc 1,sizeof int 動態分配並初始化為0 int p3 int realloc p1,si...