C 動態記憶體管理你知道嗎?

2021-10-24 18:56:50 字數 1774 閱讀 3201

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

內建型別

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

自定義型別malloc/free和new/delete

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

不同的地方是:

malloc和free是函式,new和delete是操作符;

malloc申請的空間不會初始化,new可以初始化;

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

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

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

申請自定義型別物件時,malloc/free只會開闢空間,不會呼叫建構函式與析構函式,而new在申請空間後會呼叫建構函式完成物件的初始化,delete在釋放空間前會呼叫析構函式完成空間中資源的清理。

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

記憶體洩漏的危害:長期執行的程式出現記憶體洩漏,影響很大,如作業系統、後台服務等等,出現記憶體洩漏會導致響應越來越慢,最終卡死。

void

memoryleaks()

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

堆記憶體洩漏(heap leak)

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

系統資源洩漏

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

如何檢測記憶體洩漏

如何避免記憶體洩漏

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

採用raii思想或者智慧型指標來管理資源。

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

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

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

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