C C C 記憶體管理

2021-09-25 11:00:40 字數 3732 閱讀 4455

一.c/c++記憶體分布

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

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

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

4.資料段,儲存全域性資料和靜態資料

5.**段,可執行的**/唯讀常量

二.c語言中動態記憶體管理方式

malloc/calloc/realloc和free

void* malloc(size_t size);
這個函式向記憶體申請了一塊連續可用的空間,並返回指向這塊空間的指標

1.如果開闢成功,則返回乙個指向開闢好空間的指標

2.如果開闢失敗,則返回乙個null指標,因此malloc的返回值要做檢查

3.返回值的型別是void*,所以malloc函式並不知道開闢空間的型別,由使用者決定

4.如果引數size為0,malloc的行為標準是未定義的,取決於編譯器

void* calloc(size_t num,size_t size);
1.函式的功能是為num個大小為size的元素開闢一塊空間,並把空間的每個位元組初始化為0

2.與malloc的區別在於calloc會在返回位址之前把申請的空間的每個位元組初始化為全0

void* realloc(void*,size_t size);
realloc函式可以做到對動態開闢記憶體的大小

void free(void* ptr);
1.free函式用來釋放動態開闢的記憶體

2.如果引數ptr指向的空間不是動態開闢的,那free函式的行為是未定義的

3.如果引數ptr是null指標,則函式什麼事都不做

三.c++記憶體管理方式

通過new和delete操作符進行動態記憶體管理

1.new/delete操作內建型別

void test()

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

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

2.new/delete操作自定義型別

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

四.operator new與operator delete

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

new:申請空間,呼叫建構函式初始化物件

operator new:該函式實際通過malloc來申請空間,當malloc申請空間成功時直接返回,若失敗,則嘗試空間不足應對措施,如果使用者設定了應對措施,則繼續申請,否則丟擲異常

void* operator new(位元組數)
delete:呼叫析構函式,將所指物件中的資源清理,釋放空間

operator delete:該函式最終是通過free來釋放空間

void operator delete(void* p)
五.new和operator的實現原理

1.內建型別

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

2.自定義型別

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來釋放空間

六.定位new表示式

在已分配的原始記憶體空間中呼叫建構函式初始化乙個物件

new(place_address) type

//place_address必須是乙個指標

new(place_address) type(initializer-list)

///initializer-list是型別的初始化列表

定位new表示式在實際中一般是配合記憶體池使用,因為記憶體池分配出的記憶體沒有初始化,所以如果是自定義型別的物件,需要使用new的定義表示式進行顯示呼叫析構函式進行初始化

七.單例模式

乙個類只能建立乙個物件

該模式可以保證系統中該類只有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有程式模組共享

1.餓漢模式

如果這個單例物件在多執行緒高併發環境下頻繁使用,效能要求較高,使用餓漢模式來避免資源競爭,提高響應速度

優點:簡單

缺點:可能會導致程序啟動慢,且如果有多個單例型別物件例項啟動順序不確定

2.懶漢模式

如果單例物件構造十分耗時或占用很多資源,而有可能該物件程式執行時不會用到,那麼也要在程式一開始就進行初始化,就會導致程式啟動時非常緩慢,使用懶漢模式(延遲載入)更好

優點:第一次使用例項物件時,建立物件,程序啟動無負載,多個單例例項啟動順序自由控制

缺點:複雜

八.記憶體洩漏

1.概念

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

2.危害

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

3.分類

堆記憶體洩漏:程式執行中依據需要分配通過malloc/calloc/realloc/new等從堆上分配的一塊記憶體,用完後必須通過相應的free或delete釋放。如果程式的設計錯誤導致這部分記憶體沒有被釋放,那麼以後這部分空間將不發被使用,產生堆記憶體洩漏

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

4.避免

(1)事前預防,如智慧型指標

(2)事後查錯,如洩露檢測工具

C C C 記憶體管理

一 c c 記憶體分布 棧 存放非靜態變數 函式引數 返回值,棧是向下增長的 記憶體對映段是高效的i o對映方式,用於裝載乙個共享的通風太記憶體庫,使用者可使用系統介面建立共享記憶體,做程序間通訊 堆 用於執行時的動態記憶體分配,堆是可以向上增長的 資料段 用於存放全域性資料與靜態資料 段 用於存放...

C C C 之記憶體分布

一 基本知識 c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。1 棧 就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。2 堆 就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程...

記憶體管理 記憶體管理概述

儲存器的發展方向是高速 大容量和小體積,即儲存器嘗試更高讀寫速度,更大儲存容量,更小物理體積。在計算機中,常見的儲存器有 暫存器,快取,記憶體,硬碟,一般硬碟之類的輔助儲存器又稱外存。在平均讀寫速度上,有 暫存器 快取 記憶體 外存 在單位容量 上,有 外存 記憶體 快取 暫存器 cpu處理器只能直...