第一把 大刀: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檔案中...