再談C C 記憶體管理

2021-09-01 12:38:32 字數 2287 閱讀 3411

在計算機中,不同的資料必須存放在不同的區域,記憶體會分出不同的區域。

由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。在執⾏行行函式時,函式內區域性變數量的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理理器器的指令集中,效率很高,但是分配的記憶體相對有限。

堆空間是記憶體分段中最大的空間。堆空間由使用者自行申請/釋放,在c/c++中的動態記憶體管理主要就是對堆空間的操作。

主要儲存全域性資料、靜態資料。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個運行期間都存在。例如全域性變量,static變量。

已經初始化資料區

存放已經初始化的全域性/靜態資料。

未初始化資料區

存放未初始化的全域性/靜態數資料。

該段內容不能被使用者修改。

文字常量區

主要存放常量字串。

程式**區

存放程式的二進位制**。

在c++專案中,依然可以使用c語言中的記憶體管理方式,但是c++也有自己的動態記憶體管理方式。

申請/釋放單個物件

new/delete的底層實現

new t;

//(t型別的建構函式&析構函式同時存在)

//當使用new來創造乙個物件時,程式會做如下的事情:

// 1.void* operator new(size_t size) size指t型別的大小

//

// 2.呼叫t型別的建構函式初始化物件

delete t;

//當執行delete t時,程式會做如下的事情:

// 1.呼叫t型別對應的析構函式

// 2.void operator delete(void* p) p代表指向空間起始位置的指標

//

申請/釋放物件陣列

new/delete的底層實現

new t[n]

;//(建構函式&析構函式同時存在)

//當執行new t[n]時,程式會做如下的事情:

// 1.void* operator new(size_t size) 這裡的size=sizeof(t)*n+4

//

// 2.將物件個數n儲存在空間的前4個位元組,指向空間的位址向後偏移4位元組

// 呼叫n次建構函式

//這裡多出的4位元組用來儲存所開闢空間中物件的個數,即為n

delete[

] t;

//當程式執行delete t時,程式會做如下的事情:

// 1.從空間的起始位置的前4位元組取出物件的個數n

// 呼叫n次析構函式

// 2.將指標p向前偏移4位元組

// operator delete(void* p)

//

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

使用格式:new(ptr) type或者new(ptr) type(構造函式引數)

定位new表示式常用在記憶體池中,因為通過記憶體池分配的空間並沒有經過初始化,所以可以通過使用new的定位表示式在已經申請到的空間上初始化物件。

new

//會拋異常的operator new

void

* _crtdecl operator new

(size_t size)

_throw1

(_std bad_alloc)

return

(p);

}

nothrow new
//不會拋異常的operator new

void

* _crtdecl operator new

(size_t count,

const std:

:nothrow_t&

)_throw0()

placement new
inline

void

* _crtdecl operator new

(size_t,

void

* _where)

_throw0()

operator delete
void operator delete

(void

* puserdata)

c c 記憶體管理

我一直覺得記憶體是很複雜的東西.也許我把這篇文章完成的時候,我會了解一點c 的記憶體管理機制 從硬體開始 記憶體器位址空間 匯流排位址空間 cpu位址空間 虛擬記憶體位址空間 程式位址空間 邏輯位址空間 程式位址空間對c 程式設計師來說是可見的,其他位址空間我們並不關心 通過列印pointer的值 ...

C C 記憶體管理

寫乙個好的c 程式,我們要懂得好多東西,比如說最基本的物件導向程式設計思想,c 的封裝 繼承 多型機制,設計模式等,還有乙個很重要的內容便是效能優化,像c c 這種接近底層的語言,追求的就是效能,與之相關的一項內容便是記憶體管理,記憶體分配要合理,禁止破壞記憶體,不能有記憶體洩漏,操作不好的話,程式...

C C 記憶體管理

1.相同點 失敗 null 2 使用之前都要進行判斷是否為空 3 釋放空間的方式 free 4 返回值 void 可以強制型別轉換 2.不同點 1 malloc 引數 位元組數 功能 負責將空間給出 2 calloc 引數 單個元素位元組數,元素個數 功能 給出空間,且對空間進行初始化為0 若p為n...