之前面試幾家公司,都有詢問過記憶體管理的問題,比如對堆疊的理解,比如記憶體洩露出現的原因以及解決方法等等,所以現在就根據自己所學的來總結下記憶體管理的問題,希望對大家有很好的用處;
首先要知道記憶體的劃分的區域:
1.棧:儲存區域性變數,比如乙個函式中的int i;然後出了這個函式就會釋放掉,對於出棧的方式是先入後出,可以理解為乙個函式中巢狀另乙個函式,然後先肯定釋放巢狀的函式中的區域性變數,然後再釋放外面一層的區域性變數。
2.堆:new出來的記憶體塊,比如new乙個陣列以及new乙個物件:char *ms =new char[3];thread thread=new thread(function);謹記:new完之後一定要給delete掉,否則會造成記憶體洩露。
3.自由儲存存區:是由malloc動態申請記憶體的區域。比如:char *ms;ms = (
int
*)
malloc
(
sizeof
(
int
) * 128);
對於malloc要用free進行釋放掉。
4.靜態儲存區:比如全域性變數和static修飾的變數儲存的地方。
5.常量儲存區;
其中,大家應該接觸詞語最熟悉的肯定是堆疊;對於堆疊的區別,我這裡也簡單的詳解一下;
1.方便性:棧用完在跳出函式的時候會自動釋放掉,而堆卻需要手動釋放。
2.效率性:棧是系統提供的資料結構,而堆是有c++函式庫提供,所以棧的效率高於堆。
3.是否累積記憶體碎片:棧是有嚴格的先進後出,後進後出的進出棧順序;堆是不斷的new和delete,所以會造成內
存空間不連續,導致記憶體碎片。
4.空間大小不一樣,堆空間有4g多,而棧預設為1m左右。
有很多人不知道記憶體洩露是什麼意思:記憶體洩露其實就是你new了乙個物件或者陣列沒有記性釋放和刪除。
陣列越界:指的是你定義的陣列長度小於你需要賦值的陣列長度。
野指標:指的是在在乙個函式中定義了乙個指標,在跳出這個函式的時候指標指向的位址已經給釋放掉了,但是你還用這個指標進行操作,那麼這個指標就是野指標。比如:
class a
void func2()
a->function();//這時候b已經釋放了,沒有這個位址了,所以這個a指標不知道指向**了; }
如果擔心記憶體耗盡沒有分配記憶體區域,你在每次申請記憶體後對這個指標進行判斷:
int *p =new int[4];
if(p == null)
博弈 個人 見解
由於周測 做了好久的博弈題,找了好多關於博弈的相關資料,感覺自己,似乎還是動了那麼一點點。臨睡前,就小小的總結一下,希望以後看到的時候,可以有所感悟吧!接下來是正題。講到博弈,事實上也就是找規律,可是知道一般的博弈型別能夠高速便捷的解決這個問題。博弈的型別大致有下面幾種 巴什博弈,威佐夫博奕,尼姆博...
mysql個人見解
mysql基本原理 僅個人理解 mysql屬於c s架構,即客戶端和服務端互動 1.連線 例php mysqli connect 以客戶端發起請求,mysql服務端進行接收並處理,其中客戶端每發起的一次鏈結mysql均起乙個執行緒來維持乙個socket 套接字 此時會有服務端資源的開銷,因此mysq...
BGP 個人見解
bgp是一種用於自治系統之間的動態路由協議,主要用於交換as之間的可達路由資訊,構建as域間的傳播路徑,防止路由環路的產生,並在as級別應用一些路由策略.bgp作為事實上的internet外部路由協議標準,被廣泛應用於isp之間 1,bgp是一種外部閘道器協議,起作用不在於自動發現網路topo,而在...