C 記憶體管理01 三把大刀

2021-09-29 17:23:56 字數 2235 閱讀 9009

第一把 大刀:new

class

point_ty

13.void

show()

14.17.

18.}

;

有如下**:

point_ty *ptr =

newpoint_ty(1

,2);

其實編譯器轉化為以下**:

point_ty *ptr;

trycatch

(std::bad_alloc)

operator new 可以檢視原始碼如下:

其實也就是使用malloc獲得記憶體

如果使用完畢要釋放記憶體如:delete ptr;

編譯器做以下動作:

ptr->~point_ty();//呼叫析構函式

operator delete(ptr);//釋放記憶體

operator delete的原始碼如下:

2. 第二把刀 array new

可以看出建構函式的執行順序和析構函式的執行順序相反。

其中:point_ty *ptr = new point_ty[3];

//1.會執行三次建構函式

//2.會自帶乙個cookie,最重要的功能是記錄長度。其實也就是為了和free配合。cookie會占用記憶體。

如果在釋放記憶體的時候沒有加,即delete ptr;//非delete ptr;則就會造成記憶體洩漏三個物件之中只會執行其中乙個物件的析構。

在這裡要提一點:如果析構函式有意義,在釋放的時候如果不加就會出錯。這裡主要是記憶體解析出錯。

先看看普通變數的空間分布圖:

然後看看物件空間分布圖:

就比如:

現在解釋為什麼不加報錯。前提(析構函式有意義),

因為它把析構的時候是從多算了一塊就是記錄數量的那部分,造成整個布局都亂了。

delete和delete,在布局上是不同的。delete 會記錄個數

其實也就是將物件構建於乙個存在的記憶體中使用方法如下

char *buf = (char *)malloc(sizeof(point_ty));

point_ty *ptr = new(buf)(1,2);

…delete buf;

其中編譯器將第二句轉為:

point_ty *ptr;

trycatch(std::bad_alloc)

其中operator new原始碼如下:

這也就是可以實現自己呼叫建構函式了。

iOS 記憶體管理 01

一 概述 內部管理簡單來說就是計算機內部儲存的管理,我們從馮 諾依曼結構說起,馮 諾依曼結構指出了計算機由運算器 控制器 儲存器 輸入和輸出裝置幾大部件組成。拿 iphone 8 舉例來說,運算器和控制器合在一起就是 cpu 處理器 執行記憶體為 3gb lpddr4 ram。而 64g 256g ...

OC 記憶體管理 01

1 建立物件21 分配記憶體空間,儲存物件32 初始化成員變數43 反回物件的指標位址56 過程 7 1 物件在完成建立的同時,內部會自動建立乙個引用計數器,這個計數器,是系統用來判斷是否 物件的唯一依據,8當我們的引用計數retaincount 0的時候,系統會毫不猶豫 當前物件 92.物件 re...

OC記憶體管理三

一 迴圈retain的場景 比如a物件retain了b物件,b物件retain了a物件 迴圈retain的弊端 這樣會導致a物件和b物件永遠無法釋放 迴圈retain的解決方案 當兩端互相引用時,應該一端用retain 一端用assign weak 二 class 1 class的使用 在.h檔案中...