1. c/c++記憶體分布
我們先來看下面的一段**和相關問題
int globalvar =1;
static
int staticglobalvar =1;
void
test()
;char char2=
"abcd"
;char
* pchar3 =
"abcd"
;int
* ptr1 =
(int*)
malloc
(sizeof
(int)*
4);int
* ptr2 =
(int*)
calloc(4
,sizeof
(int))
;int
* ptr3 =
(int*)
realloc
(ptr2,
sizeof
(int)*
4); free (ptr1)
; free (ptr3)
;}
【說明】
1.棧又叫堆疊,非靜態區域性變數/函式引數/返回值等等,棧是向下增長的。
2.記憶體對映段是高效的i/o對映方式,用於裝載乙個共享的動態記憶體庫。使用者可使用系統介面建立共享共 享記憶體,做程序間通訊。(linux課程如果沒學到這塊,現在只需要了解一下)
3.堆用於程式執行時動態記憶體分配,堆是可以上增長的。
4.資料段–儲存全域性資料和靜態資料。
5.**段–可執行的**/唯讀常量。
2.1 `malloc/calloc/realloc和free`
void test (
)
c語言記憶體管理方式在c++中可以繼續使用,但有些地方就無能為力而且使用起來比較麻煩,因此c++又提出了自己的記憶體管理方式:通過new和delete操作符進行動態記憶體管理。
3.1 new/delete操作內建型別
注意:申請和釋放單個元素的空間,使用new和delete操作符,申請和釋放連續的空間,使用new和delete
3.2new和delete操作自定義型別
class
test
~test()
private
:int _data;};
void
test2()
void
test2()
new和delete是使用者進行動態記憶體申請和釋放的操作符,operator new 和operator delete是系統提供的
全域性函式,new在底層呼叫operator new全域性函式來申請空間,delete在底層通過operator delete全域性
函式來釋放空間。
!!記憶體洩漏分類
c/c++程式中一般我們關心兩種方面的記憶體洩漏:
堆記憶體洩漏(heap leak)
堆記憶體指的是程式執行中依據須要分配通過malloc / calloc / realloc / new等從堆中分配的一塊記憶體,用完後必須通過呼叫相應的 free或者delete 刪掉。假設程式的設計錯誤導致這部分記憶體沒有被釋放,那麼以後這部分空間將無法再被使用,就會產生heap leak。
系統資源洩漏
指程式使用系統分配的資源,比方套接字、檔案描述符、管道等沒有使用對應的函式釋放掉,導致系統
資源的浪費,嚴重可導致系統效能減少,系統執行不穩定。
!!如何避免記憶體洩漏
工程前期良好的設計規範,養成良好的編碼規範,申請的記憶體空間記著匹配的去釋放。ps:這個理想狀
態。但是如果碰上異常時,就算注意釋放了,還是可能會出問題。需要下一條智慧型指標來管理才有保
證。採用raii思想或者智慧型指標來管理資源。
有些公司內部規範使用內部實現的私有記憶體管理庫。這套庫自帶記憶體洩漏檢測的功能選項。
出問題了使用記憶體洩漏工具檢測。ps:不過很多任務具都不夠靠譜,或者收費昂貴。
總結一下:
記憶體洩漏非常常見,解決方案分為兩種:1、事前預防型。如智慧型指標等。2、事後查錯型。如洩漏檢測工
具。
記憶體管理 記憶體管理概述
儲存器的發展方向是高速 大容量和小體積,即儲存器嘗試更高讀寫速度,更大儲存容量,更小物理體積。在計算機中,常見的儲存器有 暫存器,快取,記憶體,硬碟,一般硬碟之類的輔助儲存器又稱外存。在平均讀寫速度上,有 暫存器 快取 記憶體 外存 在單位容量 上,有 外存 記憶體 快取 暫存器 cpu處理器只能直...
記憶體管理 物理記憶體 虛擬記憶體
記憶體管理 物理記憶體 pc上有三條匯流排,分別是資料匯流排 位址匯流排和控制匯流排。32位的cpu的定址能力為4gb 2 32 個位元組。使用者最多 可以使用4gb的真實的物理記憶體。記憶體管理 虛擬記憶體 windows的所有程式 包括ring0層和ring3層的程式 可以操作的都是虛擬記憶體。...
C 記憶體管理 記憶體池
很多內容來自於網際網路,如有侵權,請告知。另外,從 收穫很多,在此表示感謝。我們寫程式經常需要 malloc 和 new 一塊記憶體出來,這些記憶體是在堆上進行分配的,在堆上分配的記憶體和在棧上分配的記憶體不同,可以長久的儲存。堆是什麼 可以把你的程序空間 想象成 4g 大小的記憶體 32 為機子上...