C 記憶體管理

2021-09-19 05:47:51 字數 2923 閱讀 6135

【說明】

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

記憶體對映段是高效的i/o對映方式,用於裝載乙個共享的動態記憶體庫。使用者可使用系統介面建立共享記憶體,做程序間通訊。

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

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

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

2.1 malloc/calloc/realloc和free

void test()

c語言記憶體管理方式在c++中可以繼續使用,但有些地方就無能為力而且使用起來比較麻煩,因此c++又提出了自己的記憶體管理方式,通過new和delete操作符進行動態記憶體管理

3.1 new/delete 操作內建型別

void test()

3.2 new和delete操作自定義型別

class test

~test()

private:

int _data;

};void test()

【注意】:在申請自定義型別的空間時,new會呼叫建構函式,delete會呼叫析構函式,而malloc和free不會。

4. operator new與operator delete函式

new和delete是使用者進行動態記憶體申請和釋放的操作符,operator new和operator delete是系統提供的全域性函式,new在底層呼叫operator new全域性函式來申請空間,delete底層通過operator delete全域性函式來釋放空間

/*

operator new: 該函式實際通過malloc來申請空間,

當malloc'申請空間成功時直接返回;申請空間失敗,

嘗試執行空間不足應對措施,如果改應對措施使用者設定了,

則繼續申請,否則拋異常

*/void *_crtdecl operator new(size_t size) _throw1(_std bad_alloc)

return (p);

}

**operator new實際也是通過malloc來申請空間,**如果malloc申請空間成功就直接返回,否則執行使用者提供的空間不足應對措施,如果使用者提供該措施就繼續申請,否則就拋異常。operator delete最終是通過free來釋放空間的

下面**演示了,針對鍊錶的節點listnode通過過載類專屬operator new/operator delete,實現鍊錶節點使用記憶體池申請和釋放記憶體,提高效率.

struct llistnode

void operator delete(void* p)

};

class list

~list()

delete _head;

_head = nullptr;

}private:

listnode* _head;

};int main()

5.1 內建型別

如果申請的是內建型別空間,new和malloc,delete和free基本類似,不同的地方是:new/delete申請和釋放的是單個元素的空間,new和delete申請的是連續空間,而且new在申請空間失敗時就會拋異常,malloc會返回null。

5.2 自定義型別

6.1 什麼是記憶體洩漏

記憶體洩漏指因為疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況。記憶體洩露並不是指內存在物理上的消失,而是應用程式分配某段記憶體後,因為設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費

void memoryleaks()

6.2 記憶體洩漏分類

堆記憶體洩漏(heap leak)

堆記憶體指的是程式執行中依據須要分配通過malloc/calloc/realloc/new等從堆中分配的一塊記憶體,用完後必須通過呼叫相應的free或delete刪掉,加入程式的設計錯誤導致這部分記憶體沒有被釋放,那麼以後這部分空間將無法再被使用,就會產生記憶體洩漏。

系統資源洩漏

指程式使用系統分配的資源,比方套接字、檔案描述符、管道等沒有使用對應的函式釋放掉,導致系統資源的浪費,嚴重可導致系統效能減少,系統執行不穩定。

6.3 如何避免記憶體洩漏

工程前期良好的設計規範,養成良好的編碼規範,申請的記憶體空間記著匹配的去釋放。ps: 這個理想狀態。但是如果碰上異常時,就算注意釋放了,還是可能會出現問題。需要下一條智慧型指標來管理才***。

採用raii思想或者只能指標來管理資源。

有些公司內部規範使用內部實現的私有記憶體管理庫,這套庫自帶記憶體洩漏檢測的功能選項。

出問題了使用記憶體洩漏工具檢測。ps: 不過很多任務具都不夠靠譜,或者收費昂貴。

【總結】

記憶體洩漏非常常見,解決方案分為兩種:1.事先預防型,如智慧型指標等。2.事後查錯型。如洩漏檢測工具。

C 記憶體管理 C 記憶體分類

c 記憶體管理 記憶體分類 moakap 在編寫程式過程中,程式設計師必須清楚程式記憶體的分配機制,合理進行記憶體管理,這樣才能得到高效的程式。同時,如果對c 記憶體分配基本概念不理解,使用不當,一方面浪費了寶貴的記憶體資源,降低了程式執行效率,另一方面還會造成程式中意想不到的錯誤。在 c 程式中,...

C 記憶體管理

在嵌入式系統中使用c 的乙個常見問題是記憶體分配,即對new 和 delete 操作符的失控。具有諷刺意味的是,問題的根源卻是c 對記憶體的管理非常的容易而且安全。具體地說,當乙個物件被消除時,它的析構函式能夠安全的釋放所分配的記憶體。這當然是個好事情,但是這種使用的簡單性使得程式設計師們過度使用n...

c 記憶體管理

這裡對我暫時所了解的記憶體機制做個記錄,以後再補。首先是記憶體分配 記憶體主要分為3個部分 一是從靜態儲存區域分配。編譯時分配好,主要存放全域性變數,static變數,程式結束釋放。二是從堆疊區域分配。函式內區域性變數存放的地方。隨變數生命週期自動釋放。效率較高,但大小有限。三是從記憶體池分配,即從...