《記憶體管理》 記憶體

2021-10-06 13:22:10 字數 2352 閱讀 9382

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 為機子上...